【问题标题】:Why isn't this asynchronous?为什么这不是异步的?
【发布时间】:2015-07-21 18:15:16
【问题描述】:

我正在尝试在 nodeJS 中进行回调。在遇到以下示例之前,我以为我已经把它们记下来了:

 function async(callback) {
    for(var i = 0; i < 10; i++) {
    } 
    callback();    
}


async(function() {
    console.log('Expected 2nd Printout');
});

console.log('Expected 1st Printout');

我对节点和回调的理解是,在调用异步函数后,将在等待异步函数完成执行时打印“预期的第 1 次打印输出”,然后在何时打印“预期的第 2 次打印输出”它已经完成了。然而,在执行这个简单的程序时,情况正好相反。

我在想,因为这是一个处理任务,而不是异步函数正在等待文件或侦听某些网络响应的情况,所以程序是以过程方式而不是异步方式运行的?

【问题讨论】:

  • 为什么你认为这是异步的?您只是传递函数并立即执行它。怎么会是异步的?
  • 我不知道 node.js 是否是这种情况,但 Javascript 本质上是单线程的。您调用函数async() 的事实不会导致它在另一个线程中运行。此外,您的空 for 循环几乎肯定会被 JITter 优化掉。

标签: javascript node.js asynchronous io callback


【解决方案1】:

您可以使用 process.nextTick() 使您的函数异步。官方文档: https://nodejs.org/docs/latest/api/process.html#process_process_nexttick_callback

一旦当前事件循环运行完成,调用回调函数。这不是 setTimeout(fn, 0) 的简单别名,它更有效。它在事件循环的后续滴答中触发任何其他 I/O 事件(包括计时器)之前运行。

还可以尝试在 Google 上搜索“了解 Node.js 事件循环”,这里有很多文章可以帮助您了解幕后发生的事情。

运行此代码:

function async(callback) {
    process.nextTick( function() {
        for(var i = 0; i < 10; i++) {
            console.log('i = ' + i);
        } 
        callback();
    });
}

async(function() {
    console.log('Expected 2nd Printout');
});

console.log('Expected 1st Printout');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2021-02-03
    • 2013-03-17
    • 2021-05-19
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多