我標誌着Dhruv直升機的回答爲有效之一,因爲它解釋了我描述的邏輯中涉及的不同概念。
getData1和getData2確實會調用異步函數(在我的情況下:doSomeEWSwork在下面),而getData3是同步的。
function doSomeEWSwork(param) {
var ewsFunction = '.....';
var ewsArgs = ....;
return ews.run(ewsFunction, ewsArgs)
.then(result => result.something)
.catch(err => console.log(err.message));
}
我的老getData1和getData2用來返回結構對象(例如{A:VAL1,B:VAL2}代替(需要Promise.all)承諾,是導致異步集團永遠不會執行/評估。
我的新getData1和getData2具有下列骨架:
function getData1_or_2(param) {
var promise = new Promise(function(resolve, reject) {
doSomeEWSwork(param) // <- important: settle this using 'then'
.then(res => {
var ret = { a: res.val1, b: res.val2 };
resolve(ret);
}).catch(err => {
console.log(err.message);
reject(Error(err.message));
});
});
return promise;
}
那麼既然我爲異步和對象同步返回承諾的主要方法(已經包括在我原來的問題)現在的工作罰款
exports.getData = (param1, param2) => {
return getData0(param1, param2)
.then(data0 => Promise.all(data0.map(e => getData1(e.id))))
.then(data1 => Promise.all(data1.map(i => getData2(i.id))))
.then(data2 => data2.map(a => getData3(a.id)))
.catch(err => console.error(err.message));
};
這只是嵌套的承諾,地圖和結構對象的混合使我困惑。 謝謝!
是'getData1()','getData2()'和'getData3()'異步操作?如果是這樣,那麼他們應該返回一個在異步操作完成時用他們的結果解決的承諾。還好奇你爲什麼使用帶有'data0.map()'和'data1.map()'的'Promise.all()',而不是'data2.map()'。如果它們不是異步操作,那麼就不需要對它們使用'Promise.all()'。實際上,您可以將所有順序同步代碼組合到一個'.then()'處理程序中。 – jfriend00
如果您向我們展示您的實際代碼(而非僞代碼),並且我們幫助您解決問題,而不是要求我們編寫可能會或可能不會教您實際需要的示例,則Stackoverflow會更好。因此,請向我們展示'getData1()','getData2()'和'getData3()'的實際代碼,您可能會獲得非常有用的幫助。 – jfriend00
我意識到這一點,但有時在發佈代碼片段之前,先澄清概念會更容易。德魯夫的回答解釋了我不確定的不同概念。另外,我添加了一個答案來總結解決方案。 – Hochman7G