javascript - Promise.resolve - 意外的结果

标签 javascript typescript es6-promise

我不明白 promise 。我知道 Promises 是可以成功或错误完成的对象。并且 promises 可以很好地执行异步函数并通过 then 连接其他异步函数。 promise 的结果作为参数传递给上次执行的 promise 的 then 方法内的回调函数(如果 promise 正确结束)。

这个例子是行不通的。我正在通过 setTimeout 模拟异步调用。我的函数返回一个整数。我希望 prom2 得到 5 分。为什么不起作用?我做错了什么,为什么?

var getProductId = function(){
    setTimeout(function () {
        return 5;
    }, 1500);
};
var prom2 = Promise.resolve(getProductId);

prom2.then(function(result){
    console.log("5 = " + result);
});

我也试过:

var getProductId = function(){
    setTimeout(function () {
        return 5;
    }, 1500);
};
var prom2 = Promise.resolve(getProductId());

prom2.then(function(result){
    console.log("5 = " + result);
});

注意:我想使用 Promise.resolve 而不是 new Promise

最佳答案

Promise.resolve 所做的就是接受一个表达式并将其转换为一个立即解析为该表达式的Promise。如果表达式是除 Promise 之外的任何类型的普通值(原始值、数组、对象等),则 Promise 返回>Promise.resolve 仍然会立即解决。您的 getProductId 函数未返回任何内容,因此您的 prom2 导致 Promise 立即解析为 undefined.

Promise.resolve 对您的情况没有帮助 - 您需要将回调转换为 Promise这是唯一的方法是使用 new Promise 构造函数:

console.log('start');
const getProductId = () => new Promise(res => setTimeout(res, 1500, 5));
getProductId().then(res => console.log(res));

使用Promise.resolve 的时候是如果你已经有一个值(同步)并且想把它变成一个你可以调用Promise。然后 上。例如,通过在以下代码中使用 Promise.resolve('begin') 作为累加器的初始值,可以使用 构造一个简单的 Promise 链减少:

const prom = ['foo', 'bar', 'baz']
  .reduce((lastProm, str) => (
    lastProm.then((lastStr) => {
      console.log(lastStr);
      return str;
    })),
    Promise.resolve('begin')
  );
  
prom.then((lastStr) => {
  console.log(lastStr);
  console.log('end');
});

关于javascript - Promise.resolve - 意外的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52883753/

相关文章:

asp.net - 如何使用 jQuery 和 asp.net 进行 onclientclick 回发

javascript - Angular2 响应式(Reactive)默认输入值

javascript - IDB交易 : onabort vs onerror

javascript - Bootstrap : modal. js v3.2.0 嵌套弹窗

Angular 错误 : EPERM: operation not permitted, lstat 'C:\Users\Enoch\Workspaces\Angular IDE 2017 CI\myangular\dist'

javascript - Angular 中带有子组件的 react 形式

node.js - 未处理的 promise 拒绝警告 : Callback was already called (Loopback remote method)

javascript - Vue Actions 中的菊花链式 promise 会导致无限循环

javascript - Angular Router按钮不触发提交事件

javascript - 返回之前等待子函数执行