NodeJS await 在子进程中不起作用

NodeJS await does not work within child process

我正在使用 Node v12。

我有一个用 fork 创建的子进程。

该子进程执行异步任务如下:

// This is a child process
console.log('before async');
(async () => {
    try {
        console.log('before await')
        await asyncTask();
        console.log('after await')
    } catch (e) {
        console.log('ERROR!!')
    } finally {
        console.log('FINALLY!!')
    }
})();
console.log('after async');
return true;

我得到的输出是

before async
before await
after async

没有错误。

我做错了什么?

------------------------(已编辑)

要添加我需要执行的模式详细信息:

我目前正在使用 Parallel.js,它使用 fork。

我愿意使用其他库或工具。

你没有做错任何事。这是事件的预期顺序。

async 函数中使用 await 只会暂停执行 await 所在的特定函数,然后该函数立即 returns 一个承诺并在函数调用后继续执行下一行代码。这正是您在这里看到的。这是预期的行为。

这是对正在发生的事情的逐步描述:

  1. console.log('before async'); 执行。
  2. 您的 async IIFE 启动并 console.log('before await') 执行。
  3. 它执行 await asyncTask(); 并且当前函数执行暂停,然后该函数立即 returns 一个承诺。
  4. 由于您未对 IIFE returns 的函数执行任何操作,因此该函数调用后的下一行代码将运行,而此 console.log('after async'); 将运行。
  5. 一段时间后,asyncTask() 返回的 promise 得到解决,await asyncTask() 完成等待,您的函数将恢复执行。

因此,其中包含 awaitasync IIFE(就像您正在使用的那样)不会暂停解释器的整个执行过程。它只会暂停 IIFE 的内部执行。一旦遇到第一个 await,紧随其后的代码行将继续执行。


为了就编写此代码的正确方法提出建议,我们需要了解有关如何使用此代码、调用它的内容以及要等待的内容的更大上下文。无法逃避异步操作。使用 async/await 不会使整体操作突然变得同步。它仍然是异步的,调用者仍然必须使用异步编程技术来处理。

或许,您应该创建一个函数,在分叉过程完成时 returns 承诺。然后,想要知道分叉进程何时完成的调用者必须使用带有 await.then() 的承诺来知道它何时完成。您不能将异步编码隐藏在函数中,然后将调用函数视为普通同步函数 - Javascript 不会那样工作。一旦调用链中的任何东西都是异步的,整个调用链就是异步的,必须使用异步编码技术来传达完成、错误和结果。