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内部不晓得做了啥处理,让返回结果的排序又正常了。
不晓得我的理解对不对。
给你这段代码可以来理解。
运行三次,结果如下
由此可见,
Promise.all
里的任务列表[asyncTask(1),asyncTask(2),asyncTask(3)]
,是按顺序发起的,由于它们都是异步的,互相之间并不阻塞,每个任务完成时机是不确定的。尽管如此,所有任务结束之后,它们的结果仍然是按顺序地映射到resultList
里,这样就能和Promise.all
里的任务列表[asyncTask(1),asyncTask(2),asyncTask(3)]
一一对应起来。