簡體   English   中英

在 Promise 的執行器 function 中的哪個點,代碼開始異步執行?

[英]At which point inside a Promise's executor function, does the code start executing asynchronously?

當我們創建一個Promise時,執行器 function 會立即被調用,但resolve回調是異步執行的回調。 這意味着如果我在執行器 function 中做一些繁重的工作導致傳遞給解析回調的結果,那么所有這些工作都會以阻塞的方式在同一個線程中執行,並且只有結果通過異步傳遞給我們回調。 我希望這種理解是正確的。

執行器 function 中的異步部分是否僅在調用預定義的異步 Web API(如獲取或超時)或調用解析或拒絕回調時啟動? 我們不能編寫自己的代碼塊在並行線程中執行嗎?

解析回調是異步執行的回調。

您的意思可能是正確的,但措辭含糊不清。

不,可以同步或異步調用resolve() ,具體取決於執行程序對其執行的操作。

new Promise(resolve => {
    resolve(); // all synchronous
});
new Promise(resolve => {
    setTimeout(resolve, 1000); // called later
});

resolve()調用立即返回,但它會安排已注冊的 promise 個處理程序(如果有的話)。

結果通過回調異步傳遞給我們

是的。 傳遞給 .then .then()的回調 function始終異步執行,以在不釋放 zalgo的情況下給出一致的 output 順序

somePromise.then(() => console.log("second"));
console.log("first"); // no matter if `somePromise` is already fulfilled or not

執行器 function 中的異步部分是否僅在調用預定義的異步 Web API 時啟動,如fetchtimeout

是的。

我們不能編寫自己的代碼塊在並行線程中執行嗎?

事實上,我們不能那樣做。 一些環境允許為並行執行創建工作人員,但它不是“代碼塊”——它是一個單獨的工作人員,您必須通過事件與之通信。

當我們創建一個 Promise 時,執行器 function 會立即被調用,但解析回調是異步執行的回調。 這意味着如果我在執行器 function 中做一些繁重的工作導致傳遞給解析回調的結果,那么所有這些工作都會以阻塞的方式在同一個線程中執行,並且只有結果通過異步傳遞給我們回調。 我希望這種理解是正確的。

是的

執行器 function 中的異步部分是否僅在調用預定義的異步 Web API(如獲取或超時)或調用解析或拒絕回調時啟動?

是(但更多,見下文)

我們不能編寫自己的代碼塊在並行線程中執行嗎?

Promises 並不意味着實現多線程。 這可以使用Web Workers來實現。 Promises 只是為了在稍后的某個時刻調用回調 function。 在特定的回調調用之前,可能有預定義的Web API函數(如setTimeoutfetch )在不同的線程中執行,但這在 Promise 中不是必需的。

請記住, "asynchronous"並不意味着"in another thread"

PS:這是我(可能有缺陷)對該主題的理解。 隨時寫一個新的答案,以防我有任何錯誤。

暫無
暫無

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

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