首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Promise.resolve -意外结果

Promise.resolve -意外结果
EN

Stack Overflow用户
提问于 2018-10-19 07:05:15
回答 1查看 784关注 0票数 3

我不明白诺言。我知道Promise是可以成功完成也可以错误完成的对象。promises可以很好地执行异步函数,也可以通过then连接其他异步函数。promise的结果作为参数传递给最后执行的promise的then方法中的回调函数(如果promise以正确的方式结束)。

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

代码语言:javascript
复制
var getProductId = function(){
    setTimeout(function () {
        return 5;
    }, 1500);
};
var prom2 = Promise.resolve(getProductId);

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

我也试过了:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-19 07:10:42

Promise.resolve所做的就是接受一个表达式,并将其转换为一个立即解析为该表达式的Promise。如果表达式是Promise以外的任何类型的普通值(原语、数组、对象等),则Promise.resolve返回的Promise仍将立即解析。您的getProductId函数没有返回任何内容,因此您的prom2将生成一个Promise,它会立即解析为undefined的值。

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

代码语言:javascript
复制
console.log('start');
const getProductId = () => new Promise(res => setTimeout(res, 1500, 5));
getProductId().then(res => console.log(res));

如果您已经有一个值(同步地),并且希望将其转换为可以调用.thenPromise,那么就应该使用Promise.resolve。例如,在下面的代码中,通过使用Promise.resolve('begin')作为累加器的初始值,可以使用reduce构造一个简单的Promise

代码语言:javascript
复制
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');
});

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52883753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档