[英]Execute promises when all resolved (as DB Transactions)
我有兩個需要充當事務的承諾,如果其中一個失敗,則應該發生“回滾”。
例如:當我創建一個用戶時,我想發送一個確認 email,但是如果發送 email 時出錯,會創建用戶但永遠不會得到確認。
await saveUser(user)
await sendEmail(user)
如果我切換順序,當創建用戶出現問題時會發生什么? 它將得到確認。
await sendEmail(user)
await saveUser(user)
我認為Promise.all
可以解決問題,但事實並非如此。
await Promise.all([saveUser(user), sendEmail(user)]);
有沒有辦法在 Javascript 上執行承諾作為交易? 當且僅當它們都解決時,Promise 才應該執行。
JavaScript 中沒有像某些數據庫中那樣內置的“事務機制”。 您無法及時返回 go 以撤消您已經執行的操作。 如果您希望在sendEmail
失敗時反轉saveUser
的效果,那么您需要創建另一個 function,例如unsaveUser
,並在sendEmail
失敗時調用它。
這可以通過以下方式完成:
使用承諾:
saveUser(user)
.then(() => sendEmail(user))
.catch(err => {
if (err.message === "Email Error") { // Check the exception to determine if the email failed
unsaveUser(user);
}
});
// This will only send the email if 'saveUser' was successful, and call 'unsaveUser' if email fails
使用異步/等待同樣的事情:
try {
await saveUser(user);
sendEmail(user);
} catch(err) {
if (err.message === "Email Error") { // Check the exception to determine if the email failed
unsaveUser(user);
}
}
要使此示例正常工作,在您的異步sendEmail
function 中,您必須throw new Error("Email Error");
在檢測到錯誤時。 如果您使用解析/拒絕,它將是reject(new Error("Email Error"));
.
我希望這對您來說很清楚,並可以幫助您解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.