代码之家  ›  专栏  ›  技术社区  ›  Mil0R3

回调未在Node.js中异步执行

  •  0
  • Mil0R3  · 技术社区  · 12 年前

    回调函数:

    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 回复  |  直到 12 年前
        1
  •  3
  •   hexacyanide    12 年前

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

        2
  •  1
  •   Jason    12 年前

    我认为你用那个紧环是在消磨时间。为什么你试图编写自己的睡眠函数,而不是 built in timers setTimeout setInterval ?

    推荐文章