【发布时间】:2016-11-04 15:47:21
【问题描述】:
当我在学习 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 是 true 并且可能同步函数同步工作。因此,我认为一切都是同步工作的,并且 foo() 将在 bar() 之前被调用。为什么在这种情况下不是这样?
以下方法要好得多:
function definitelyAsync(arg, cb) {
if (arg) {
process.nextTick(cb);
return;
}
fs.stat('file', cb);
}
【问题讨论】:
-
不清楚是先调用
foo()还是bar()除非你查看maybeSync()函数的内部结构。 即使那样你也不会真的知道在运行时会发生什么,除非您可以保证传递给它的值将始终属于某种类型。您应该能够依赖于始终同步或始终异步的特定函数,而无需查看该函数是如何实现的。 -
@nnnnnn ,好的,我明白了。请再问一个问题,mayberSync() 函数的第二个参数中的 () => { ... } 是什么?我无法在谷歌上搜索它:S
-
它们被称为箭头函数,是新 ES6 (EcmaScript 6) 的一部分。
() => { ... }是function() { ... }的简写形式 - 但请注意范围也存在一些差异。
标签: javascript node.js asynchronous synchronous