0

回调函数:

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
4

2 回答 2

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()改用。

于 2013-09-27T03:10:50.407 回答
1

我认为你正在用那个紧密的循环杀死线程。您为什么要编写自己的睡眠功能而不是内置的计时器 setTimeoutsetInterval

于 2013-09-27T03:12:18.977 回答