理解.then()ES6

时间:2016-03-30 21:47:37

标签: javascript asynchronous promise es6-promise

我的代码中遇到了一个让我困惑很长时间的错误,我正在寻找一些澄清。

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

使用promise保留异步代码可以解决流问题,但为什么会这样?

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

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/

2 个答案:

答案 0 :(得分:5)

  

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

你完全可以。但任何值 - 无论是承诺还是其他 - 从普通的异步回调中addPointCloudNormals只是像往常一样被忽略

return回调中开始异步操作没有任何改变,then只是不返回一个承诺 - 而setTimeout将不知道任何异步发生它可以等待。

如果您想从回调中返回一个承诺并获得该最终结果的另一个承诺,那么它必须是then回调:

then

答案 1 :(得分:0)

然后是同步功能,所以如果你想在那里做异步任务,你必须返回一个Promise。

此外,Promise.all期待一系列承诺。不是数组的数组。

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/