[英]Callback of an asynchronous function is never called
我有一個等待異步函數執行其工作然后返回的函數。
function synchronous(){
var notYet = true;
setTimeout(function(){
notYet = false;
}, 1000);
while(notYet)
;
return "Done synchronously!";
}
console.log(synchronous());
此處使用while
循環直到異步函數的回調(此處為setTimeout
)被執行時,函數synchronous
停止。 但是,永遠不會調用回調(使用回調內部的alert
進行檢查),因此, notYet
將保持為true
,並且功能循環將永遠持續下去。 那么,為什么在1000毫秒后沒有調用回調?
注意:我不在乎如何將異步函數轉換為同步函數。 我的問題是為什么回調不被調用?
不會調用該回調,因為可以調用它的唯一線程是在執行無限循環時被捆綁在一起。
在瀏覽器中,JavaScript在單個主UI線程上運行(加上您要創建的Web工作者數)。 該線程在作業隊列上運行:它拾取要執行的作業(例如,處理單擊),執行該作業,然后讓其返回以等待下一個作業。 您正在使用無限循環來阻塞那個線程。 計時器在作業隊列中安排回調(可能是特定於實現的),但是線程永遠不會完成當前作業(稱為無限循環的作業),因此它永遠不會接聽下一個作業。
NodeJS還可以在單個線程中運行您的代碼,因此也可以執行相同的操作。 (並非所有環境都可以,但我不知道有任何帶有setTimeout
,它們沒有將計時器回調計划在請求它的同一線程上。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.