Promise.all 是先进先出吗?
发布于 8 年前 作者 im-here 8260 次浏览 来自 问答

假如我有一个数组,里面只存了id,我要根据这个id取异步查询数据。 代码如下:

var id_arr=[1,4,5,2];
var tasks=[];
for(var i in arr){
  tasks.push(asyncQuery(arr[i]));
  }
  
Promise.all(tasks).then(function(val){
		//这里拿到的val数组里的顺序是我前面添加的顺序一样吗?是先进先出吗?
	})
	

如果不是先进先出的话,我现在的需求是:id_arr其实就是这些数据的一个排名,我根据id拿到每个数据的详细信息,最后把整个数据显示出来。 有没有什么办法呢?

12 回复

就我以前试过,应该是按顺序的。

是按顺序的

@welefen O(∩_∩)O哈哈~

那另一个问题就来

var id_arr=[1,4,5,2];
var tasks=[];
for(var i in arr){
  tasks.push(asyncQuery(arr[i]));
}

let result = yield tasks

此时的yield是按顺序的么?

'use strict'

let sleep = (time, info) => {
  return new Promise(function (resolve) {
    setTimeout(function () {
        console.log(info)
        resolve('this is ' + info)
    }, time)
  })
}

let loser = sleep(1000, 'loser')
let winner = sleep(4, 'winner')

// main
Promise.all([winner, loser]).then(value => {
    console.log("所有都完成后会执行then,它们是并行的哦: " + value)    // => 'this is winner'
})

$ node ../promise/api/all.js 
winner
loser
所有都完成后会执行then,它们是并行的哦: this is winner,this is loser

@i5ting 好像确实是并行的,但是最终的value里的顺序好像和all里的顺序是一致的吧

@i5ting let result = yield tasks 肯定是按tasks的顺序的,不要问我为什么,我纯粹是猜的,呵呵。

@imhered 对呀,执行是先进先出,但并行执行(每项哪个先执行完成不好说),结果按顺序给,这点和yield数组是一样的

@i5ting 明白! <center>3Q</center>

@imhered <center><h1>哈哈

不是先进先出 所有都反回才会promise.all 才会resolve 执行是按array顺序执行 但是返回的的顺序就不一定了 From Noder

@IssicLzx 你错了。 执行是并行的,是不是按array顺序执行不一定,返回是按array的顺序。

回到顶部