Node.js nodejs中的回调顺序

Node.js nodejs中的回调顺序,node.js,Node.js,我在理解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) => {

我在理解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完成执行吗

我想我完全搞错了。

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

代码的顺序如下所示:

  • 将“Hello”写入文件
  • 写入“Hello”时:将
    1
    打印到控制台
  • 1
    写入控制台时:开始向文件追加“World!”
  • 现在,触发了2个进程,可能会首先执行4个进程:

  • 添加“World!”的过程开始时:将
    3
    打印到控制台
  • 添加“World!”的过程完成后:将
    2
    打印到控制台
  • console.log(“3”)
    不会“等待”,因为它不是
    appendFile
    回调的一部分。只有回调(即
    console.log(“2”);
    )会“等待”
    appendFile
    完成

    代码的顺序如下所示:

  • 将“Hello”写入文件
  • 写入“Hello”时:将
    1
    打印到控制台
  • 1
    写入控制台时:开始向文件追加“World!”
  • 现在,触发了2个进程,可能会首先执行4个进程:

  • 添加“World!”的过程开始时:将
    3
    打印到控制台
  • 添加“World!”的过程完成后:将
    2
    打印到控制台

  • 执行
    console.log(“1”)
    后,调用
    fs.appendFile
    ,但不等待它完成。它允许异步执行被调用的函数,并转到第
    行console.log(“3”)

    在该函数的末尾,
    console.log(“3”)
    作为回调执行


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

    执行
    console.log(“1”)
    后,调用
    fs.appendFile
    ,但不等待它完成。它允许异步执行被调用的函数,并转到第
    行console.log(“3”)

    在该函数的末尾,
    console.log(“3”)
    作为回调执行


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

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