首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解.then() ES6

理解.then() ES6
EN

Stack Overflow用户
提问于 2016-03-30 21:47:37
回答 2查看 2.6K关注 0票数 2

我在代码中遇到了一个错误,困扰了我很长一段时间,我想要得到一些澄清。

在这段代码中,注释掉的内部承诺导致了问题。在结束时,Promise.all()在setTimeout一命中就会继续,而不是在超时内的解析之后。

用承诺包装异步代码可以解决流程问题,但为什么会这样呢?

本质上,为什么我们不能在.then()链中运行正常的异步代码,在异步回调结束时返回一个Promise.resolve()?

代码语言:javascript
复制
var asyncPromise = function() {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            console.log('Async Promise done');
            resolve();
        }, 1000);
    });
};

var generateSignupPromises = function(qty) {
    var promiseArray = [];
    for (var i = 1; i <= qty; i++) {
        promiseArray.push(
            function() {
                return asyncPromise()
                .then(function() {
                    console.log('Before Timeout');

                  //Uncommenting this fixes the issue
                  //return new Promise(function(resolve, reject) {
                        setTimeout(function() {
                            console.log('After Timeout');
                            //resolve();
                            return Promise.resolve();
                        }, 500);
                  //})
                });
            }
        );
    }
    return promiseArray;
};

var test = generateSignupPromises(1);

Promise.all([test[0]()])
.then(function() {
    console.log('Done');
});

链接到正在运行的代码:http://www.es6fiddle.net/imfdtuxc/

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-30 21:59:41

为什么我们不能在.then()链中运行正常的异步代码,在异步回调结束时返回一个Promise.resolve()?

你完全可以。但是任何价值--不管是承诺还是什么--普通异步回调中的return都会像往常一样被忽略。

then回调中启动异步操作对此没有什么改变,setTimeout只是不返回承诺--而且then不会知道它可能等待的任何异步事件。

如果您想从回调中返回一个承诺,并为最终结果获得另一个承诺,则必须是一个then回调:

代码语言:javascript
复制
asyncPromise()
.then(function() {
    return new Promise(function(resolve, reject) {
//  ^^^^^^
        setTimeout(resolve, 500);
    }).then(function() {
//     ^^^^^^^^^^^^^^^
        return Promise.resolve();
    });
});
票数 5
EN

Stack Overflow用户

发布于 2016-03-30 21:55:27

然后是一个同步函数,所以如果你想在里面执行异步任务,你必须返回一个承诺。

而且,Promise.all期望得到一系列的承诺。不是数组的数组。

代码语言:javascript
复制
var asyncPromise = function() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      console.log('Async Promise done');
      resolve();
    }, 1000);
  });
};

var generateSignupPromises = function(qty) {
  var promiseArray = [];
  for (var i = 1; i <= qty; i++) {
    promiseArray.push(
      function() {
        return asyncPromise()
        .then(function() {
          console.log('Before Timeout');

          //Uncommenting this fixes the issue
          return new Promise(function(resolve, reject) {
          setTimeout(function() {
            console.log('After Timeout');
            resolve();
            //return Promise.resolve();
          }, 500);
          })
        });
      }
    );
  }
  return promiseArray;
};

var test = generateSignupPromises(1);

Promise.all([test[0]()])
.then(function() {
  console.log('Done');
});

http://www.es6fiddle.net/imfe2sze/

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

https://stackoverflow.com/questions/36320341

复制
相关文章

相似问题

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