簡體   English   中英

node.js + bluebird:解決promise.all

[英]node.js + bluebird: resolving promise.all

我有一個函數requestJSON ,它查詢一個外部API並返回一個(bluebird)承諾。

問題: b之前得到解決c被添加到列表,以便使promise.all運行,而只有ab得到解決。

碼:

 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
問題:有沒有語義的理由把apromise.allb +該解決方案讓我想起了,諾前期回調的瘋狂。

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM