我NodeJS version 16.14.0正在嘗試從管理遷移promise .then().catch到async/await管理。
問題在于,使用第一種方法,我能夠按順序鏈接多個函式,同時通過每個函式傳遞相同的大物件(return resolve(bigObject)每個函式都作為輸入相同bigObject)。我這樣做是因為我能夠管理資料中的微錯誤(因此不涉及捕獲),向用戶回傳完整的錯誤串列:
var commonData = {
data1: ...
data2: ...
data3: ...
data4: ...
data5: ...
data6: ...
};
return function1(commonData)
.then(function2)
.then(function3)
.then(function4)
.then(function5)
.then(function(result) {
//Inside this .then, I'd have the "result" variable as result of the chain
})
.catch(error => { return reject(error); });
我如何使用異步等待系統來做到這一點?這是我迄今為止嘗試過的:
var commonData = {
data1: ...
data2: ...
data3: ...
data4: ...
data5: ...
data6: ...
};
commonData = await function1(commonData);
commonData = await function2(commonData);
commonData = await function3(commonData);
commonData = await function4(commonData);
commonData = await function5(commonData);
//I was expecting to have inside "commonData" the same situation
//as "result" in the chain above
是否有另一種方法可以將函式與我丟失的相同大物件鏈接起來?
編輯:
我在這部分中使用的 2 個函式......它們是這樣設計的,因為它們也在檔案的其他部分被呼叫,我無法在本地使用它們
//function 1
async function function1(commonData) {
try {
var data1 = await models.data1.findAll({where: {Domain_ID: [13,15]}})
data1.forEach(function(dat) {
commonData.data1.push(dat.dataValues);
});
return commonData;
} catch (error) {
throw error;
}
}
//function2
async function function2(commonData) {
try {
var data2 = await models.data2.findAll();
data2.forEach(function(dat) {
commonData.data2.push(dat.dataValues);
});
return commonData;
} catch (error) {
throw error;
}
}
uj5u.com熱心網友回復:
不,沒有別的辦法。實作 Async/Await 的原因之一是 Promise 鏈看起來非常丑陋和混亂。如果您愿意.then(),請在此模塊中堅持使用它。
進一步閱讀:https ://blog.logrocket.com/promise-chaining-is-dead-long-live-async-await-445897870abc/
uj5u.com熱心網友回復:
你擁有它的方式(commonData = await function1(commonData)等)很好。但如果你不想這樣做,你可以嵌套呼叫:
const result = await function5(
await function4(
await function3(
await function2(
await function1(commonData)
)
)
)
);
或使用回圈:
let result = commonData;
for (const fn of [function1, function2, function3, function4, function5]) {
result = await fn(result);
}
或者你可以繼續使用then. 雖然通常通過 / 與顯式承諾處理程式混合async/await是.then令人.catch困惑的,但您可能會在某些有限的時間這樣做:
const result = await function1(commonData)
.then(function2)
.then(function3)
.then(function4)
.then(function5);
它之所以有效,是因為async函式只是一種消費和產生 Promise 的方式。
或者有一個非常重要的警告,即您知道函式僅修改物件的狀態并且不回傳(履行其承諾)不同的物件,您可以這樣做:
await function1(commonData);
await function2(commonData);
await function3(commonData);
await function4(commonData);
const result = await function5(commonData);
但這是一個很大的警告。
uj5u.com熱心網友回復:
嘗試使用 Promise.all 方法
更多資訊在這里:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all?retiredLocale=it
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/445791.html
標籤:javascript 节点.js 承诺 链接
