簡體   English   中英

用Javascript編寫異步方法(代碼在Node.js中運行)

[英]Writing an asynchronous method in Javascript (Code run in Node.js)

在下面的代碼中,我試圖理解編寫異步JavaScript函數的概念。 要明確我的假設:

函數logTest()被調用。 它調用asyncTest(),並傳遞log()函數。 但是,asyncTest()不會直接調用log()。 而是將其傳遞到堆棧清除時要調用的事件隊列。 直到for循環完成后,才應清除堆棧,寫入20個“ waiting ...”。 但是,控制台輸出將“異步”行放在for循環之前。 我在Node.js中運行了這段代碼,其中console.log是一個同步功能。 有誰知道為什么“ async”行不是最后寫的?

function asyncCall(method) {
  return setTimeout(method, 0);
}

function log(str) { console.log(str); }

function logTest() {
  asyncCall(log("async"));
  for(var i = 0; i < 20; i++) {
    log("waiting...");
  }
}

logTest();

這是因為,您將結果 log("async")而不是功能logasyncCall

基本上,它執行了log("async") (在執行asyncCall之前將“ async”記錄到控制台)。 調用的結果(由於log不返回任何內容,因此undefined )傳遞給asyncCall 然后執行異步調用。

您可能需要將其更改為:

asyncCall(log.bind(null, "async"))

要么

asyncCall(function(){
  log("async");
});

您沒有傳遞log("async") ,而是調用它並將結果傳遞給asyncCall()

一旦添加() ,(通常)便會調用一個函數。 如約瑟夫所說,您可以傳入log.bind(null, "async") (盡管我更喜歡綁定this ),也可以傳入一個調用log("async")的新函數,方法是:

asyncCall(function(){
  log("async");
}); 

但是,要回答您的實際問題,您的假設是在20個“正在等待...”之后將打印“異步”,這是不正確的。 為了更好地了解事件隊列,建議您閱讀以下內容

基本上,即使從技術上講,節點是單線程的,它的行為也類似於多線程應用程序,因此它可以像同時執行許多操作一樣工作。

暫無
暫無

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

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