【发布时间】:2022-01-27 04:46:48
【问题描述】:
我一直在思考什么是使用 Javascript 处理大量繁重操作的最佳方法,我想出了以下方法:
const results: Promise<void>[] = [];
// Start all pieces of work concurrently
for (const record of await getData()) {
results.push(doSomeHeavyWork(records));
}
// Collect the results
for (const result of results) {
// Isolate the failures so one doesn't break another.
try {
await result;
} catch (error) {
console.log(JSON.stringify(error));
}
}
我的理解是,上面的 sn-p 与最长的操作一样长,这与获得 AFAIK 一样好。但是,有没有更好或更惯用的方法来解决这个问题?
我并不一定要在这里查看节点。这可能是节点、Deno 或浏览器代码。
【问题讨论】:
-
在浏览器代码中,您可以使用
setTimeout(myTimeConsumingFunction, 0),它将在单独的浏览器线程中运行该函数。 -
事件循环不会使任何东西并发。
doSomeHeavyWork是做什么的?真的是异步工作吗? -
doSomeHeavyWork 做了大量的 IO 吗?如果是这样,使用承诺是有意义的。如果您实际上正在做大量的 CPU 工作,那么您正在做的事情将无济于事,因为一切仍在同一线程中运行。相反,您需要考虑使用工作线程。
-
@JavierGarcíaManzano Doing
Promise.all(data.map(doSomeHeavyWork)).catch(…)等待所有结果,但如果任何一个失败,则完全失败。如果您将.catch()单独放在每个doSomeHeavyWork调用上,它也会等待所有结果,但对于那些失败的结果会导致undefined(或您返回的任何catch回调)。Promise.allSettled也将等待所有结果,但让您仅在一切完成后处理(或记录)错误,而不是在错误发生时立即处理。
标签: javascript node.js typescript event-loop deno