Node.js:异步回调vs同步回调vs process.nextTick vs setTimeout

时间:2016-11-05 10:25:28

标签: javascript node.js asynchronous callback

我刚刚开始在node.js中开发。最近,我在&{39; deep'中做了一些dive event loop。和节点的异步机制。但我仍然不完全理解sync and async callbacks之间的差异。

在这个来自node.js API的例子中,我理解为什么不清楚首先调用哪个函数。

maybeSync(true, () => {
  foo();
});
bar();

但是,如果我们有:

syncOrAsync(arg, () => {
 if (arg) {
   cb(arg);
   return;
 }
});

syncOrAsync(true, function(result) {
  console.log('result');
});

console.log('after result);

我不清楚为什么它们总是以同步顺序执行,尽管我做了一个回调函数,该函数应该在堆栈为空之后由事件循环执行(console.log ('结果')完成后)。我是否总是需要添加process.nextTick(cb);才能获得异步? process.nextTick和setTimeout();之间有什么不同?

1 个答案:

答案 0 :(得分:3)

除非你有一些实际上是异步的东西,比如定时器或外部调用等,代码将始终是同步的,因为这是所有javascript代码的默认状态。
添加回调不会使其异步

以下是异步代码的示例

function syncOrAsync(sync, cb) {
    if (sync) {
        return cb();
    } else {
        setTimeout(cb, 100); // async, waits 0.1 seconds to call callback
    }
}

syncOrAsync(true, function(result) { // synchronous call
    console.log('result 1'); // happens first
});

syncOrAsync(false, function(result) { // asynchronous call
    console.log('result 2'); // happens last, as it's async
});


console.log('result 3');     // happens second

使用process.nextTick()并不会使函数异步,但它确实有些相同

function syncOrAsync() {
    console.log('result 1'); // this happens last
}

process.nextTick(syncOrAsync);

console.log('result 2'); // this happens first

这会将syncOrAsync的执行推迟到事件循环的下一次传递,因此它在很多方面与setTimeout(syncOrAsync)相同,但该函数仍然不是异步的,回调会立即执行,我们只是延迟函数的整个执行。