[英]Why does javascript ES6 Promises continue execution after a resolve?
據我所知,promise 是可以 resolve() 或 reject() 的東西,但我很驚訝地發現在調用 resolve 或 reject 后,promise 中的代碼繼續執行。
我認為 resolve 或 reject 是 exit 或 return 的異步友好版本,這將停止所有立即函數執行。
有人可以解釋為什么以下示例有時會在解析調用后顯示 console.log 背后的想法:
var call = function() {
return new Promise(function(resolve, reject) {
resolve();
console.log("Doing more stuff, should not be visible after a resolve!");
});
};
call().then(function() {
console.log("resolved");
});
JavaScript 有“運行到完成”的概念。 除非拋出錯誤,否則函數將一直執行,直到到達return
語句或其結尾。 函數之外的其他代碼不能干擾它(除非再次拋出錯誤)。
如果你想讓resolve()
退出你的初始化函數,你必須在它前面加上return
:
return new Promise(function(resolve, reject) {
return resolve();
console.log("Not doing more stuff after a return statement");
});
當您resolve
承諾時將調用的回調仍然需要規范異步調用。 這是為了確保在將 Promise 用於同步和異步操作的混合時保持一致的行為。
因此,當您調用resolve
,回調已排隊,並且函數執行會立即繼續執行resolve()
調用之后的任何代碼。
只有一旦 JS 事件循環被重新控制,回調才能從隊列中移除並實際調用。
resolve()
函數根本不像return
。 它只是表明使用then()
方法注冊的回調函數的參數現在已准備就緒,回調函數可能會離開 Job 隊列(或 Micro 任務隊列)並進入主 JS 調用堆棧,但僅此而已當所有同步代碼和在此之前進入隊列的異步代碼完成運行時發生。 console.log("Not doing more stuff after a return statement");
你代碼中的這條語句是同步代碼,優先級還是異步代碼。 這就是它首先運行的原因
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.