【问题标题】:Callback not executing asynchronously in Node.js回调未在 Node.js 中异步执行
【发布时间】:2023-03-04 18:03:02
【问题描述】:

回调函数:

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

【问题讨论】:

    标签: javascript node.js asynchronous express nonblocking


    【解决方案1】:

    回调将同步执行,除非您将其排队以在事件循环的下一次迭代中运行。这就是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()

    【讨论】:

    • 补充一点:即使OP使用回调,调用也不是异步的。
    【解决方案2】:

    我认为你正在用那个紧密的循环杀死线程。为什么要编写自己的睡眠函数而不是 built in timers setTimeoutsetInterval

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 2015-08-17
      • 2016-05-01
      • 2013-12-15
      • 2012-06-03
      • 1970-01-01
      相关资源
      最近更新 更多