美文网首页
Promise.all

Promise.all

作者: Evan_zhan | 来源:发表于2017-09-29 18:09 被阅读0次

    示例代码

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

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

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

    • 比如我们需要上传100张图片,等100个全部上传完之后再进一步解析图片
    • 比如在页面加载时,需要先下载完各种资源,再进行页面的初始化

    但是

    问题一、

    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;
    }

    相关文章

      网友评论

          本文标题:Promise.all

          本文链接:https://www.haomeiwen.com/subject/dgyiextx.html