【发布时间】:2021-01-01 23:33:53
【问题描述】:
我正在尝试弄清楚如何进行异步函数调用并使用 async/await。这在分解长流程时可能很有用。我能想到的最佳解决方案写在下面。有更好的方法吗?
NB 这是一个人为的例子。问题不在于如何处理长时间运行的进程。这是关于进行“异步函数调用并使用 [of] async/await”。
async function callAsync(fn) {
let args = Array.prototype.slice.call(arguments, 1);
return new Promise((resolve, reject) => {
setImmediate(() => {
try {
resolve(fn(...args))
}
catch (e) {
reject(e);
}
})
})
}
async function longProcessPart1(x) {
return x;
}
async function longProcessPart2(x) {
return x;
}
(async function fn() {
try {
let result = await callAsync(longProcessPart1, 1);
result = await callAsync(longProcessPart2, result); // Use the result of longProcessPart1 in longProcessPart2.
console.log(result);
}
catch (e) {
console.log(e);
}
}())
【问题讨论】:
-
确实是这样。请注意,如果它们不能并行完成,那么长流程,如果一个依赖于前一个的结果,那么使它们异步没有任何好处,所以你只需一个一个地等待它们。
-
@MadaManu setImmediate 是否允许其他进程可能在每个 longProcessN 之间运行?如果要对此类进程进行排队,我正在尝试允许其他进程在 longProcess1 和 longProcess2 之间运行。
-
我不太喜欢“可能”这个词。何时何地运行的是序列。如果要允许进程在其他进程之间运行,那么就会失去执行流程。这个想法是,如果有其他进程不依赖于它们的结果来启动另一个进程,那么它们可以被执行。想象 3 个进程 a、b、c(都返回相应的值)。如果计算 c 依赖于 a 但不依赖于 b。 A&B 过程可以并行发生,但 C 只能在 A 之后发生。
-
@MadaManu 我制作 longProcess1 和 longProcess2 异步函数的一个原因是它们也可能等待异步进程(这是实际用例中的场景)。
-
@MadaManu 在第一次 setImmediate 之后,如果 HTTP 服务器(例如,本机 http 模块)正在运行,是否可以将回调添加到轮询队列中?并且,添加到 Poll 队列的回调是否可以在 longProcess1 和 longProcess2 之间执行?
标签: node.js async-await es6-promise