Promise.resolve - 出乎意料的结果?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (289)

我不懂Promises。我知道Promises是可以成功或错误完成的对象。承诺很好地执行异步函数并通过连接其他异步函数then。promise的结果作为参数传递给then最后执行的promise 的方法内的回调函数(如果promise以右边结束)。

此示例不起作用。我正在通过setTimeout模拟异步调用。我的函数返回一个整数。我期待得到一个5的结果prom2。为什么不起作用?我做错了什么,为什么?

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不会帮助你的情况 - 你需要将回调转换为a Promise唯一的方法是使用new Promise构造函数:

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

使用时间Promise.resolve是指您已经拥有一个值(同步)并希望将其转换为Promise您可以调用.then的值。例如,通过Promise.resolve('begin')在以下代码中使用累加器的初始值,Promise可以构造一个简单的链reduce

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');
});
用户回答回答于

Promise.resolve()Promise.resolve(value)方法返回一个使用给定值解析的Promise对象。如果值是promise,则返回该promise; 如果该值是一个值得的(即具有“then”方法),则返回的promise将“跟随”那个可能的,采用其最终状态; 否则返回的承诺将与值一起实现。此函数将类似promise的对象的嵌套层(例如,解析为解析为某事物的promise的promise)展平为单个层。

所以,基本上函数Promise.resolve返回的结果getProductIdundefined。如果你想得到结果5,你需要使用new Promise构造函数。

此代码段显示了getProductId演示用法的结果(55)Promise.resolve

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

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

扫码关注云+社区

领取腾讯云代金券