2016-09-11 54 views
1

在下面的例子中從http://bluebirdjs.com/docs/api/promise.all.htmlBluebird中的Promise.all()是否等待迭代器?

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"); 
}); 

它是確保通過(藍鳥)承諾,我們開始Promise.all()線或者是用於循環如此之快,我們可以假設他們以前的for循環會完成會在Promise.all()之前完成嗎?

我想了解我可以期望,以完成,我需要環繞承諾,所以我不寫這樣的事情是什麼時,沒有必要:

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

'for'循環是同步的,所以它是由單線程保證的,它絕對會在下一行代碼之前完成,而不管它是什麼。 – adeneo

+1

如果沒有藍鳥,那麼這將是微不足道的 - > https://jsfiddle.net/dy3cmart/ – adeneo

回答

2

是,它會等待,假設fs.writeFileAsync()返回一個承諾(由於NodeJS沒有writeFileAsync()方法,我不能分辨出這是從哪個fs庫得到的)。

for循環是同步的,所以它必須在Promise.all()被調用之前完成。它開始一堆異步調用,但它立即用每次調用的一個承諾填充files數組。

這些承諾將以文件寫入完成的順序自行解決。在這一點上,你的all promise將稱之爲.then()方法。

+3

「異步」後綴看起來像是藍鳥「Promsie.promisifyAll」的結果 - 所以這是一個相當不錯的選擇,它返回一個承諾 –

+0

@JaromandaX是的,這是Bluebird的一個特性。 [所有promisified函數接收後綴'Async'。](http://bluebirdjs.com/docs/api/promisification.html) – peteb

+0

@peteb - 其實這不完全正確 - 你可以[設置自己的後綴](http: //bluebirdjs.com/docs/api/promise.promisifyall.html#option-suffix) –

相關問題