【发布时间】:2017-08-03 23:40:53
【问题描述】:
我被引导相信 Promise.all 会并行执行您传递给它的所有函数,并不关心返回的 Promise 完成的顺序。
但是当我写这个测试代码时:
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.?
还是我在做这件事的过程中遗漏了什么?
【问题讨论】:
-
承诺主体是同步评估的。
-
因此,如果其中一个承诺是从数据库中获取某些内容,而另一个承诺是从 Web API 获取数据,它将异步执行此操作,但我告诉它打印到的任何内容屏幕会按照我在数组中指定的顺序完成吗?
-
与
Promise.all无关。当你创建一个 Promise 时,你传入的函数会立即被评估,所以Promise1的主体在你调用Promise2或Promise.all之前运行。 Javascript 不是多线程的,所以你的for循环永远不会像那样重叠。 -
Here's 是
Promise.all工作原理的示例。 Promise 以它们创建的顺序开始,但它们是并行运行的。 -
Is Node.js native Promise.all processing in parallel or sequentially? 的可能重复项。请注意,promise 本身不会使同步循环“并行”或“异步”,它仅有助于表示已经异步的事物(如数据库查找、Web api 调用或超时)。