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
没有错误。
我做错了什么?
------------------------(已编辑)
要添加我需要执行的模式详细信息:
- 我需要消费一个对象列表
- 对于我需要调用 AWS 服务的每个对象(使用 SDK)
- 我需要运行它们并行
- 我需要等待所有的人才能进行下一个任务
我目前正在使用 Parallel.js,它使用 fork。
我愿意使用其他库或工具。
你没有做错任何事。这是事件的预期顺序。
在 async
函数中使用 await
只会暂停执行 await
所在的特定函数,然后该函数立即 returns 一个承诺并在函数调用后继续执行下一行代码。这正是您在这里看到的。这是预期的行为。
这是对正在发生的事情的逐步描述:
console.log('before async');
执行。
- 您的
async
IIFE 启动并 console.log('before await')
执行。
- 它执行
await asyncTask();
并且当前函数执行暂停,然后该函数立即 returns 一个承诺。
- 由于您未对 IIFE returns 的函数执行任何操作,因此该函数调用后的下一行代码将运行,而此
console.log('after async');
将运行。
- 一段时间后,
asyncTask()
返回的 promise 得到解决,await asyncTask()
完成等待,您的函数将恢复执行。
因此,其中包含 await
的 async
IIFE(就像您正在使用的那样)不会暂停解释器的整个执行过程。它只会暂停 IIFE 的内部执行。一旦遇到第一个 await
,紧随其后的代码行将继续执行。
为了就编写此代码的正确方法提出建议,我们需要了解有关如何使用此代码、调用它的内容以及要等待的内容的更大上下文。无法逃避异步操作。使用 async/await
不会使整体操作突然变得同步。它仍然是异步的,调用者仍然必须使用异步编程技术来处理。
或许,您应该创建一个函数,在分叉过程完成时 returns 承诺。然后,想要知道分叉进程何时完成的调用者必须使用带有 await
或 .then()
的承诺来知道它何时完成。您不能将异步编码隐藏在函数中,然后将调用函数视为普通同步函数 - Javascript 不会那样工作。一旦调用链中的任何东西都是异步的,整个调用链就是异步的,必须使用异步编码技术来传达完成、错误和结果。
我正在使用 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
没有错误。
我做错了什么?
------------------------(已编辑)
要添加我需要执行的模式详细信息:
- 我需要消费一个对象列表
- 对于我需要调用 AWS 服务的每个对象(使用 SDK)
- 我需要运行它们并行
- 我需要等待所有的人才能进行下一个任务
我目前正在使用 Parallel.js,它使用 fork。
我愿意使用其他库或工具。
你没有做错任何事。这是事件的预期顺序。
在 async
函数中使用 await
只会暂停执行 await
所在的特定函数,然后该函数立即 returns 一个承诺并在函数调用后继续执行下一行代码。这正是您在这里看到的。这是预期的行为。
这是对正在发生的事情的逐步描述:
console.log('before async');
执行。- 您的
async
IIFE 启动并console.log('before await')
执行。 - 它执行
await asyncTask();
并且当前函数执行暂停,然后该函数立即 returns 一个承诺。 - 由于您未对 IIFE returns 的函数执行任何操作,因此该函数调用后的下一行代码将运行,而此
console.log('after async');
将运行。 - 一段时间后,
asyncTask()
返回的 promise 得到解决,await asyncTask()
完成等待,您的函数将恢复执行。
因此,其中包含 await
的 async
IIFE(就像您正在使用的那样)不会暂停解释器的整个执行过程。它只会暂停 IIFE 的内部执行。一旦遇到第一个 await
,紧随其后的代码行将继续执行。
为了就编写此代码的正确方法提出建议,我们需要了解有关如何使用此代码、调用它的内容以及要等待的内容的更大上下文。无法逃避异步操作。使用 async/await
不会使整体操作突然变得同步。它仍然是异步的,调用者仍然必须使用异步编程技术来处理。
或许,您应该创建一个函数,在分叉过程完成时 returns 承诺。然后,想要知道分叉进程何时完成的调用者必须使用带有 await
或 .then()
的承诺来知道它何时完成。您不能将异步编码隐藏在函数中,然后将调用函数视为普通同步函数 - Javascript 不会那样工作。一旦调用链中的任何东西都是异步的,整个调用链就是异步的,必须使用异步编码技术来传达完成、错误和结果。