虽然我正在学习https://nodejs.org/api/process.html#process_process_nexttick_callback_arg,但我还是坚持了一点。我在下面引用它:
API非常重要,无论是100%同步还是100% 异步。考虑这个例子:
// WARNING! DO NOT USE! BAD UNSAFE HAZARD!
function maybeSync(arg, cb) {
if (arg) {
cb();
return;
}
fs.stat('file', cb);
此API有害,因为在以下情况中:
maybeSync(true, () => {
foo();
});
bar();
目前尚不清楚是否首先调用foo()或bar()。
我不明白为什么不清楚是先调用foo()还是bar()。因为arg是真的,并且可能同步功能同步工作。因此,一切都是同步工作的,foo()将在bar()之前调用,我想。为什么这种情况不适用于这种情况?
以下方法要好得多:
function definitelyAsync(arg, cb) {
if (arg) {
process.nextTick(cb);
return;
}
fs.stat('file', cb);
}
答案 0 :(得分:1)
执行不明确,因为fs.stat()
是异步的,并且在下一个刻度时最快执行,这意味着bar()
将始终在foo()
之前执行。
但是,通过引入if (arg)
子句立即执行cb()
,foo()
将在bar()
之前执行 - 这是同步的。
因此,maybeSync()
在执行之前不知道arg
是什么就没有可预测性。
definitelyAsync()
强制始终执行异步执行,方法是在cb()
分支内安排对if (arg)
的调用,这将始终导致bar()
在foo()
之前执行无论arg
值如何。