回调不是在Node.js中异步执行的

时间:2013-09-27 03:06:49

标签: javascript node.js asynchronous express nonblocking

一个callBack函数:

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我认为你是用这个紧密循环杀死线程的。为什么要尝试编写自己的睡眠功能而不是built in timers setTimeoutsetInterval