【问题标题】:Node.js: async callback vs sync callback vs process.nextTick vs setTimeout [duplicate]Node.js:异步回调与同步回调与 process.nextTick 与 setTimeout [重复]
【发布时间】:2017-03-19 03:21:45
【问题描述】:

我刚刚开始在 node.js 中进行开发。最近,我在 'event loop' 和 node 的异步机制中做了一些 deep dive。但我仍然不完全理解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);

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

【问题讨论】:

  • 除非你有真正异步的东西,比如计时器或外部调用等。代码将始终是同步的,因为这是所有 javascript 代码的默认状态,添加回调不会使其异步.
  • 所以我总是需要加process.nextTick()?
  • 不,你需要添加一些异步的东西。

标签: javascript node.js asynchronous callback


【解决方案1】:

除非你有一些实际上是异步的,比如计时器或外部调用等。代码将始终是同步的,因为这是所有 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) 相同,但函数仍然不会是异步的,回调将立即执行,我们只是延迟了函数的整个执行。

【讨论】:

  • 所以,如果我理解你是正确的。当您处理数据库、文件读取、链接请求等资源时,node.js 中异步的真正力量就会发挥作用。这些资源需要大量的 I/O 操作。其他东西正在同步,除非你将它们包装在 process.nextTick();setTimeout(cb);
  • 是的,Javascript 是同步和单线程的,一切都按照编写的顺序发生。异步代码大部分时间都依赖于内置的异步函数,在浏览器中是 ajax、计时器等,而在 Node 中则是调用操作系统、数据库查找等。
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 2015-07-30
  • 2015-02-23
  • 2012-12-17
  • 2021-05-28
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多