了解.then()ES6

Ell*_*iot 2 javascript asynchronous promise es6-promise

我在代码中遇到一个错误,使我困惑了很长一段时间,并且正在寻求澄清。

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

用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');
});
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 5

为什么我们不能只在.then()链中运行普通的异步代码,而在异步回调的末尾返回Promise.resolve()呢?

你完全可以。但是,return从普通的异步回调中获得的任何值(无论是承诺还是其他值)都将照常忽略

没有什么可以在then回调内部启动异步操作来对此进行更改,setTimeout只是不会返回承诺-并且then不会知道任何异步等待发生的事情。

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

asyncPromise()
.then(function() {
    return new Promise(function(resolve, reject) {
//  ^^^^^^
        setTimeout(resolve, 500);
    }).then(function() {
//     ^^^^^^^^^^^^^^^
        return Promise.resolve();
    });
});
Run Code Online (Sandbox Code Playgroud)