【问题标题】:Please explain example in nextTick documentation请在 nextTick 文档中解释示例
【发布时间】:2015-02-23 17:20:02
【问题描述】:

更新:事实证明这是一个非常愚蠢的问题。在引用的示例中,我只是没有注意到一些简单的事情。

我一直在查看有关滴答声和事件循环的信息,大部分情况都很清楚,但the nextTick documentation 中有一个示例让我感到困惑。它说:

对于 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, function() {
  foo();
});
bar();

那么不清楚是先调用 foo() 还是 bar()。

第一个问题:为什么 foo 不能保证首先被调用?有一个简单的函数调用(可能是同步)、一个 if 和一个 cb=foo 的回调。我认为这个链中的某些东西在某种程度上(可能)是异步的,将某些东西推送到事件队列并继续执行?我看不出有什么东西会产生这种效果。

第二个问题:是否有一些文档可以帮助我自己理解这一点?

【问题讨论】:

    标签: javascript node.js events


    【解决方案1】:

    这很简单。如果没有arg,则保证首先调用foo,如果有arg,则保证“最后”调用foo。想象一下这里的调用堆栈:

    arg 存在

    • 可能在同一事件循环迭代中立即调用cbfoo 在同一个事件循环迭代中也被同步调用
    • 可能会返回 - 所以在这种情况下永远不会调用 fs.stat
    • barfoo 完成后调用

    arg 不存在

    • 也许同步调用fs.stat(这是异步的)提供cb作为回调
    • 在当前的事件循环迭代中没有更多的同步代码可以运行,因此 bar 被调用
    • fs.stat 已完成,它在 next 事件循环迭代(在 bar 之后)调用 cbfoo 同步执行,但这次在另一个事件循环迭代中

    两者都很明显。这里的问题是,在大多数情况下,您事先不知道是否有任何 arg 值(否则 if 中不需要 :))因此您可能有两种运行此代码的场景,这会使事情变得非常复杂。

    process.nextTick 在此处模仿fs.stat 的异步特性,因此foo 在下一个事件循环迭代中总是被调用,从而使流程可预测。

    【讨论】:

    • 嗯,我对这个答案中的几件事感到困惑:1.您颠倒了“foo不存在”/“foo存在”?如果它不存在就不能调用它,可以吗? 2. 为什么 fs.stat 只在其中一种情况下被调用? 3. 你似乎在说 foo 总是在 bar 之前被调用,如果 foo 被调用的话。那么我看不出代码有什么不清楚的地方,即这个例子有什么意义。
    • 1.糟糕,抱歉 - 我的意思是 arg 这里。 2. 有return 语句,所以如果您提供arg,则不会调用fs.stat。 3. foo总是被调用,因为cb总是被调用。这两个例子的区别只是foobar的调用顺序。
    • 啊,好吧,这只是我临时代码盲的双重情况:不知何故,我既没有注意到 return 语句(丑陋!在我看来应该是 if-else),也没有fs.stat 的“cb”参数。谢谢。
    猜你喜欢
    • 2013-07-04
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多