Promise.all

示例代码

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文适用的读者 本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,...
    HZ充电大喵阅读 12,049评论 6 19
  • 00、前言Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区...
    夜幕小草阅读 6,406评论 0 12
  • Promiese 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,语法上说,Pr...
    雨飞飞雨阅读 8,650评论 0 19
  • 工作,心里有些空荡,仔细想来,不是和朋友家人交流的需要,而是创作的需要:很需要画幅画,很需要写段话,很需要唱首歌,...
    谢慈玲阅读 1,702评论 0 0
  • 暑假到了,除了作业我还去了学习班,除了学习之外,嘿嘿,我还经常玩手机。每天,我都会玩到很晚。第二天起床我很难受,妈...
    赵旋汝阅读 3,767评论 0 5

友情链接更多精彩内容