bluebird中的Promise.all()是否等待迭代器?

时间:2016-09-11 03:07:51

标签: javascript node.js promise bluebird

以下示例来自http://bluebirdjs.com/docs/api/promise.all.html

var files = [];
for (var i = 0; i < 100; ++i) {
    files.push(fs.writeFileAsync("file-" + i + ".txt", "", "utf-8"));
}
Promise.all(files).then(function() {
    console.log("all the files were created");
});

是否确保(bluebird)承诺for循环在我们开始Promise.all()行之前完成或者for循环如此之快以至于我们可以假设它们将在Promise.all()行之前完成?< / p>

我试图了解我能期望按顺序完成什么,以及我需要将Promise包裹起来,以便在不必要的时候不要写这样的东西:

some_promise_that_makes_files_array_with_for_loop().then(function(files){
    Promise.all(files).then(function() {
        console.log("all the files were created");
    });
});

1 个答案:

答案 0 :(得分:2)

是的,它会等待,假设fs.writeFileAsync()返回一个promise(由于NodeJS没有writeFileAsync()方法,我无法判断这是来自哪个fs库。)

for循环是同步的,因此必须在调用Promise.all()之前完成。它启动了一堆异步调用,但它会立即填充files数组,每次调用一个承诺。

这些承诺将以文件写入完成的任何顺序自行解决。此时,您的all promise会将其称为.then()方法。