与Promise.all并行操作?

我被引导相信Promise.all执行所有你并行传递的函数,并不关心返回的promise的结束顺序。

但是当我写这个testing代码时:

function Promise1(){ return new Promise(function(resolve, reject){ for(let i = 0; i < 10; i++){ console.log("Done Err!"); } resolve(true) }) } function Promise2(){ return new Promise(function(resolve, reject){ for(let i = 0; i < 10; i++){ console.log("Done True!"); } resolve(true) }) } Promise.all([ Promise1(), Promise2() ]) .then(function(){ console.log("All Done!") }) 

我得到的结果是这样的

 Done Err! Done Err! Done Err! Done Err! Done Err! Done Err! Done Err! Done Err! Done Err! Done Err! Done True! Done True! Done True! Done True! Done True! Done True! Done True! Done True! Done True! Done True! Done! 

但是,如果它们并行运行,我不希望它们在同一时间执行,并给我这样的结果?

 Done Err! Done True! Done Err! Done True! Done Err! Done True! Done Err! Done True! Etc. Etc.? 

还是我以这样的方式错过了一些东西?

这是因为你的承诺是阻止和同步! 尝试一些超时而不是同步循环:

 function randomResolve(name) { return new Promise(resolve => setTimeout(() => { console.log(name); resolve(); }, 100 * Math.random())); } Promise.all([ randomResolve(1), randomResolve(2), randomResolve(3), randomResolve(4), ]) .then(function(){ console.log("All Done!") }) 

一个非asynchronous主体被串行执行当你到达一个asynchronous调用(例如一个URL)时,数组中的其他Promise将会开始执行。