gpt4 book ai didi

javascript - 请解释 nextTick 文档中的示例

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:34 25 4
gpt4 key购买 nike

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

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

It is very important for APIs to be either 100% synchronous or 100% asynchronous. Consider this example:

// WARNING!  DO NOT USE!  BAD UNSAFE HAZARD!
function maybeSync(arg, cb) {
if (arg) {
cb();
return;
}

fs.stat('file', cb);
}

This API is hazardous. If you do this:

maybeSync(true, function() {
foo();
});
bar();

then it's not clear whether foo() or bar() will be called first.

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

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

最佳答案

这非常简单。 foo如果没有arg,保证首先被调用以及 foo如果有 arg 则保证被称为“最后” 。想象一下这里的调用堆栈:

<强> arg存在

  • 也许同步通话 cb立即在同一事件循环迭代中。 foo也在同一事件循环迭代中同步调用
  • maybeSync 返回 - 所以 fs.stat在这种情况下从未被调用
  • barfoo 之后调用已完成

<强> arg不存在

  • 也许同步通话 fs.stat (异步)提供 cb作为回调
  • 当前事件循环迭代中不再需要运行同步代码 bar被称为
  • fs.stat已完成并调用 cb下一个事件循环迭代中(在 bar 之后)。 foo同步执行,但这次在另一个事件循环迭代中

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

process.nextTick模仿 fs.stat 的异步性质在这里,这样foo在下一个事件循环迭代时始终调用,使流程可预测。

关于javascript - 请解释 nextTick 文档中的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27656391/

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