【问题标题】:Callback order in nodejsnodejs中的回调顺序
【发布时间】:2020-03-31 19:07:59
【问题描述】:

我在理解 nodejs 将文本写入/附加到文件中的回调方法的调用顺序时遇到问题:

fs.writeFile(path.join(__dirname, '/test', 'hello.txt'), 'Hello ', (err) => {
  if (err) throw err;

  console.log("1");


  fs.appendFile(path.join(__dirname, '/test', 'hello.txt'), 'World!', (err) => {
    if (err) throw err;

    console.log("2");
  });

  console.log("3");
});

执行这段代码我得到输出顺序:1、3、2

但是逻辑调用顺序不是 1、2、3 吗?或者 console.log("3") 不是简单地“等待”到 appendFile 完成执行吗?

我猜我这里完全搞错了。

【问题讨论】:

  • 不,它不会等待,这就是为什么你必须使用回调。 writeFile 回调中的所有代码都会立即执行,并且对 appendFile 的嵌套回调将添加到待办事项列表中,以供该操作完成时使用。
  • @jonrsharpe 您的意思是立即按 1、追加、3 的顺序?然后追加函数调用?
  • 是的,这正是您所看到的。

标签: node.js


【解决方案1】:

console.log("3"); 不会“等待”,因为它不是appendFile 回调的一部分。只有回调(即console.log("2");)“等待”appendFile 完成。

你的代码顺序如下:

  1. 将“Hello”写入文件
  2. 写入“Hello”时:将1 打印到控制台。
  3. 1 写入控制台时:开始附加“世界!”到文件中

现在,触发了 2 个进程,可能会先执行 4 个:

  1. 附加“世界!”的过程时已开始:将3 打印到控制台
  2. 附加“世界!”的过程时已完成:将2 打印到控制台

【讨论】:

    【解决方案2】:

    在执行 console.log("1") 之后,调用 fs.appendFile 但不会等到它完成。它允许异步执行被调用函数并转到console.log("3") 行。

    在该函数结束时,console.log("3") 作为回调执行。

    显然你的doSomthing 不是一个可以调用和跳过的异步函数。所以代码必须等待该函数的完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多