2016-07-11 20 views
1

此安全設備是否必需?Promise.all中的可執行文件(ES6和Bluebird)

Promise.all([...].map((thenable) => Promise.resolve(thenable))); 

是否可以安全提供thenables到採集方法 - Promise.allPromise.race等?任何陷阱?

這個問題關注Bluebird,以及polyfilled和所有原生ES6承諾實現。

+0

您可以在傳遞給'Promise.all()'的迭代器中提供任何可選值或值。你不必將自己包裝成承諾。 'Promise.all()'的實現將測試它們是否是可用的,如果是的話,等待它們的解析,否則,值將是解析。查看演示:https://jsfiddle.net/jfriend00/jgf0xwhm/ – jfriend00

回答

5

這是沒有必要的,應該由承諾實現本身來完成:

all函數返回的滿足與 陣列實現值的傳遞承諾新的承諾,或與 拒絕第一個通過承諾的原因是拒絕。 它解析了傳遞迭代的所有 元素以承諾,因爲它運行此 算法。

ES2015 Specification, paragraph 25.4.4.1 Promise.all (iterable)

措辭更容易by MDN

如果有什麼可迭代數組中傳遞是不是一個承諾,它是由Promise.resolve轉換爲一個。

+0

謝謝。我猜這同樣適用於藍鳥。我對[Promise]和可接受類型在[Bluebird docs](http://bluebirdjs.com/docs/api/promise.all.html)中可以互換使用這一事實感到困惑,並且沒有提到可敬的/承諾 - 喜歡。 – estus