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

标签 javascript node.js asynchronous callback

我不久前开始使用node.js进行开发。最近,我做了一些deep dive进入'event loop '以及 Node 的异步机制。但我仍然不完全理解 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('after result ')完成了)。我是否总是需要添加 process.nextTick(cb);获得异步? process.nextTick 和 setTimeout(); 之间有什么区别? ?

最佳答案

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

关于javascript - Node.js:异步回调 vs 同步回调 vs process.nextTick vs setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40437117/

相关文章:

javascript - 无法读取未定义的 jQuery animate 的属性 'propHooks'

node.js - D3 转换可以在 Nodejs 上运行吗?

javascript - 如何返回变量并同时重置/删除它

javascript - 确定异步执行何时完成

ajax - 如何使用 Google Analytics Async 跟踪 Magento Onepage 中的 AJAX 部分

java - 如何调试CompletableStage死锁?

javascript - 使用 Javascript 创建倒计时

javascript - 如何使用 ajax 填充选择选项?

javascript - 如何检查完全支持 deviceorientation 事件的设备/浏览器?

javascript - javascript的 `new Date()`使用什么系统调用?