javascript - es6中的promise.all使用问题

查看:73
本文介绍了javascript - es6中的promise.all使用问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

promise.all接收的promise数组是按顺序执行的还是一起执行的,也就是说返回的结果顺序是固定的吗。

edit1:
根据大家的回答,应该是同步执行的,但是这样就有效率问题了,如果想改成异步执行怎么办呢。

edit2:弄糊涂了,有些人认为结果是按顺序返回,有些人认为结果顺序不确定。

var a = new Promise(function  (resolve,reject) {
    setTimeout(function  () {
        resolve('aaa');
    },3000);
});

var b = new Promise(function  (resolve,reject) {
    setTimeout(function  () {
        resolve('bbb');
    },1000);
});

var p = Promise.all([a,b]);
p.then(function(val) {
    console.log(val);
});//结果:['aaa','bbb']

我写了个测试,可以看到a的时间虽然比较长,但a的结果确实排在了b的前面。
返回结果的确是按顺序排列的。但是,

var a = new Promise(function  (resolve,reject) {
    setTimeout(function  () {
        resolve('aaa');
    },3000);
});

var b = new Promise(function  (resolve,reject) {
    setTimeout(function  () {
        resolve('bbb');
    },3000);//改成3秒
});

var p = Promise.all([a,b]);
p.then(function(val) {
    console.log(val);
});//结果:['aaa','bbb']

将b的时间也改成3秒后,发现整体运行时间并没有改变。

所以我认为,promise应该是并发执行的,这样的话结果返回的顺序应该也是乱的,但promise.all内部不晓得做了啥处理,让返回结果的排序又正常了。

不晓得我的理解对不对。

解决方案

给你这段代码可以来理解。

const getRandom = () => +(Math.random()*1000).toFixed(0);

const asyncTask = taskID => new Promise(resolve => {
    let timeout = getRandom();
    console.log(`taskID=${taskID} start.`);
    setTimeout(function() {
        console.log(`taskID=${taskID} finished in time=${timeout}.`);
        resolve(taskID)
    }, timeout);
});

Promise.all([asyncTask(1),asyncTask(2),asyncTask(3)])
.then(resultList => {
    console.log('results:',resultList);
});

运行三次,结果如下

由此可见,Promise.all里的任务列表[asyncTask(1),asyncTask(2),asyncTask(3)],是按顺序发起的,由于它们都是异步的,互相之间并不阻塞,每个任务完成时机是不确定的。尽管如此,所有任务结束之后,它们的结果仍然是按顺序地映射到resultList里,这样就能和Promise.all里的任务列表[asyncTask(1),asyncTask(2),asyncTask(3)]一一对应起来。

这篇关于javascript - es6中的promise.all使用问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆