Promise.all

2017-09-29  本文已影响0人  Evan_zhan

示例代码

Promise.all([runAsync1(), runAsync2(), runAsync3()]).then(function(results){
    console.log(results);
});

promise.all接受一个数组作为参数,数组里的每个元素都返回一个promise。
等到数组中的每个promise都完成(resolve或reject)后,才会执行then方法。
而每个promise的返回都会在then的参数results中。

是吧,用法很简单,使用的业务场景也很常见

但是

问题一、

promise.all是并行的吗,它在javascript的事件机制里到底是怎么执行的呢?
这是promise.all的源码:

function PromiseAll(iterable) {
var deferred = NewPromiseCapability(this);
var resolutions = new InternalArray();
function CreateResolveElementFunction(index, values, promiseCapability) {
    var alreadyCalled = false;
    return (x) => {
        if (alreadyCalled === true) return;
        alreadyCalled = true;
        //把这个promise实例的执行结果缓存到resolutions数组中
        values[index] = x;
    };
}

var i = 0;
for (var value of iterable) {
    //把传入的参数用promise.resolve转化为Promise对象实例
    var nextPromise = this.resolve(value);
    //转换完成后调用then方法执行
    nextPromise.then(
    CreateResolveElementFunction(i, resolutions, deferred),
    deferred.reject);
    ++i;
}
return deferred.promise;
}
上一篇下一篇

猜你喜欢

热点阅读