簡體   English   中英

回調未在Node.js中異步執行

[英]Callback not executing asynchronously in Node.js

回調函數:

function queryDemo(param,callBack){
    function sleep(milliSeconds) {
        var startTime = new Date().getTime();
        while (new Date().getTime() < startTime + milliSeconds);
    } 
    sleep(10000);
    callBack(param);
}

快遞代碼:

app.get('/demo', function(req, res){
    console.log(1);
    queryDemo(JSON.stringify(req.query),function(result){
        console.log(2);
    });
    console.log(3);
});

然后瀏覽http://127.0.0.1/demo ,控制台中的輸出為

1
//wait 10 seconds here
2
3

我認為正確的輸出應該是:

1
3
// 10 seconds later
2

除非您將其排隊以在事件循環的下一次迭代中運行,否則回調將同步執行。 這就是process.nextTick()的用途。

function queryDemo(param, callback) {
  function sleep(milliseconds) {
    var startTime = new Date().getTime();
    while (new Date().getTime() < startTime + milliseconds);
  } 
  sleep(10000);
  process.nextTick(function() {
    callback(param);
  });
}

但是,如果使用此方法,仍將阻止該應用程序並獲得以下輸出:

1
// 10 second pause
3
2

要延遲函數本身的執行,請對函數本身的調用進行排隊:

process.nextTick(function() {
  queryDemo(JSON.stringify(req.query), function(result) {
    console.log(2);
  });
});

還要注意,您的sleep()函數仍然會阻止該應用程序,因此您應該改用setTimeout()

我認為您正在使用緊密循環來殺死線程。 為什么要嘗試編寫自己的睡眠函數,而不是內置的計時器 setTimeoutsetInterval

暫無
暫無

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

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