簡體   English   中英

承諾后的操作順序

[英]Order of operations after promises

我對 JavaScript(使用 Node.js)還很陌生,還在學習。 我試圖用承諾環繞我的頭,但我遇到了這種情況,我不明白這段代碼之間是否有區別:

promiseFunc().then(() => {
     anotherPromiseFunc() // I dont need .then() here, just want to save some data to DB
 });
doSmthElse()

這個代碼:

promiseFunc().then(async () => {
     await anotherPromiseFunc() // I dont need .then() here, just want to save some data to DB
 });
doSmthElse()

如果我在第一種情況下不使用 .then( .then() ,是否意味着doSmthElse() anotherPromiseFunc()可能在 anotherPromiseFunc() 執行之前執行? 所以為了防止這種情況,我必須添加async / await 或者.then()塊中的所有代碼在執行其他操作之前都在等待執行?

注意 1:我不想鏈接這些承諾,因為在我的案例中有更多代碼,但我只是在這里簡化了它。

注意2:我不使用catch,因為如果錯誤會發生,我會在稍后捕獲它。

如果我在第一種情況下不使用 .then( .then() ,是否意味着doSmthElse()有可能在 AnotherPromise( AnotherPromise()執行之前執行?

doSmthElse()保證在執行處理程序中的任何內容執行之前執行。 Promise 履行和拒絕處理程序總是異步調用。 無論您是否使用async聲明處理程序 function 都是如此。

例如:

 console.log("before"); Promise.resolve(42).then(result => { console.log("within", result); }); console.log("after");

其 output 為:

before
after
within 42

所以為了防止這種情況,我必須添加async / await

當執行doSmthElse()時,您在示例中添加async / await的位置不會改變。

如果您希望doSmthElse()等到 promise 已完成,請將其移動完成處理程序中。¹

如果您的代碼在async function 中,則可以使用await代替,如下所示:

// Inside an `async` function
await promiseFunc().then(() => {
    anotherPromiseFunc();
});
doSmthElse()

那會這樣做:

  1. 調用promiseFunc()並獲取它返回的 promise
  2. 通過then將一個履行處理程序連接到該 promise,返回一個新的 promise; 新的 promise 是await的操作數
  3. 等待來自 #1 的 promise 解決
  4. 當它這樣做時,您的履行處理程序將被執行並運行anothterPromiseFunc()等待它返回的 promise 解決(因為,正如您所說,您沒有從履行處理程序返回 promise)。
  5. 此時,來自 #2 的 promise 已實現,因為您的實現處理程序(有效地)返回了undefined ,這不是一個thenable (松散地,一個承諾),因此該值( undefined )用於實現來自 #2 的 promise .
  6. 由於 #2 中的 promise 已滿足,因此滿足await並執行doSmthElse()

¹您傳遞的then作為其第一個參數

我假設Promise()只代表一些 function 調用返回 Promise:

您可以這樣說。然后注冊一個事件偵聽器,該偵聽器在 promise 穩定后立即運行 => 任務完成。 它仍然異步運行因此在您的示例中,即使 promise 尚未解決, doSmthElse仍將運行(因此,如果 promise 未立即解決, doSmthElse將在 ZC1C425264E68385D1ABZA4 內部調用之前調用)。

讓您的代碼“按順序”運行。 您必須使用await來確保在doSmthElse解決之后調用 doSmthElse,或者您可以將doSmthElse放入 .then 塊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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