簡體   English   中英

永不調用異步函數的回調

[英]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.

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