簡體   English   中英

全部解決后執行承諾(作為數據庫事務)

[英]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.

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