[英]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()
那會這樣做:
promiseFunc()
並獲取它返回的 promisethen
將一個履行處理程序連接到該 promise,返回一個新的 promise; 新的 promise 是await
的操作數anothterPromiseFunc()
但不等待它返回的 promise 解決(因為,正如您所說,您沒有從履行處理程序返回 promise)。undefined
,這不是一個thenable (松散地,一個承諾),因此該值( undefined
)用於實現來自 #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.