這個問題在這里已經有了答案: 將 async/await 與 forEach 回圈一起使用 32 個答案 3 小時前關閉。
我有一個補丁端點,它需要一組欄位來更新,迭代每個欄位,并更新正確的值。一旦完成所有這些事情,我想做一些事情發送回應,但我不知道如何等待操作回圈。如果這是一個單一的操作,我可以添加 .then(),但在這種情況下這不起作用。什么是優雅的解決方案?
代碼:
const updateUser = (req, res) => {
const db = mongoConnection.getDb();
for (key in req.body) {
db.collection('users').updateOne(
{username: req.query.username},
{$set: {[key]: req.body[key]}}
)
}
// send response once for loop is done
}
uj5u.com熱心網友回復:
您可以在回圈內標記外部函式async和每個資料庫更新。await然后你就會知道回圈完成后,所有的資料庫更新都完成了。
更好的方法是并行運行更新,因為它們不相互依賴。您可以使用Promise.allSettled()which 接受一系列承諾并在最后一個完成時解決。
const updateUser = async (req, res) => {
const db = mongoConnection.getDb();
const dbUpdates = Object.entries(req.body).map((key, value) => {
return db.collection('users').updateOne(
{ username: req.query.username },
{ $set: { [key]: value }}
);
});
await Promise.allSettled(dbUpdates);
// Send response, at this point all DB updates are done
};
uj5u.com熱心網友回復:
我認為一個簡單的答案是將 for 回圈隱藏在異步函式中,然后在端點中使用它。
const updateUserField = async () =>
db.collection("users").updateOne(
{
username: req.query.username,
},
{
$set: { [key]: req.body[key] },
}
);
const updateUserEndpoint = (req, res) => {
for (let field of req.body) {
await updateUserField(field);
}
res.status(200).send('updated');
}
然后,為了測驗,您可以使用注入函式本身的函式包裝端點:
const updateUserEndpoint = (userUpdateFunc) => userUpdateFunc(req, res);
這種模式稱為依賴注入 - 在為端點撰寫單元測驗時,您只需替換userUpdateFunc為您想要使用的任何模擬函式。這消除了在測驗中對函式進行猴子補丁的需要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/448903.html
標籤:javascript 节点.js 异步
