[英]node.js + bluebird: resolving promise.all
我有一個函數requestJSON
,它查詢一個外部API並返回一個(bluebird)承諾。
問題: b
之前得到解決c
被添加到列表,以便使promise.all
運行,而只有a
和b
得到解決。
碼:
let promises = []; // push promise a promises.push(requestJSON(..)); // push promise b promises.push(requestJSON(..).then((response) { // push promise c promises.push(requestJSON({foo: response.bar}); }); promises.all((data) => { console.log(data.length) // --> 2 });
問題:對於這個問題,我無法提出真正令人滿意的解決方案。 是否有節點方式/最佳實踐?
可能的解決方案
(I)將b
c.then
另一個諾言,然后在c.then
內部c.then
。
問題:除了使代碼混亂之外,還有一個額外的承諾實際上並不會做很多事情。
let promises = []; // push promise a promises.push(requestJSON(..)); // push helper promise promises.push(new Promise((resolve, reject) => { // push promise b promises.push(requestJSON(..).then((response) { // push promise c promises.push(requestJSON({foo: response.bar}); // resolve helper promise resolve(); }).catch(..); })); promises.all((data) => { console.log(data.length) // --> 4 });
(II)將所有內容放入b.then
。
問題:有沒有語義的理由把a
和promise.all
內b
+該解決方案讓我想起了,諾前期回調的瘋狂。
let promises = []; // push promise b promises.push(requestJSON(..).then((response) { // push promise a promises.push(requestJSON(..)); // push promise c promises.push(requestJSON({foo: response.bar}); promises.all((data) => { console.log(data.length) // --> 3 }); });
您必須從.then
回調中返回一些內容。 如果您想繼續等待其他東西,則可以是一個值(然后該承諾被視為已解決)或另一個承諾。
let promises = [
requestJSON(/* [1] */),
requestJSON(/* [2] */).then(response => {
return requestJSON(/* [3] */);
})
];
// this waits for [1] and [3]
promises.all(promises).then(results => {
console.log(data.length);
});
您的代碼未從.then()
返回任何內容。 因此,函數的返回值是undefined
,並且promise將以undefined
的結果作為結果。
上面的代碼可以寫成(請注意,沒有完整正文的箭頭函數的隱式return
):
let promises = [
requestJSON(/* [1] */),
requestJSON(/* [2] */).then(response => requestJSON(/* [3] */))
];
promises.all(promises).then(results => console.log(data.length));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.