gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:40 25 4
gpt4 key购买 nike

我不久前开始使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com