【发布时间】:2021-07-12 01:50:21
【问题描述】:
试图确定一个大列表中有多少个偶数。遵循简单的方法:遍历列表并在找到偶数时增加计数。示例代码:
const list = [34, 1, 35, 3, 4, 8]; //This list may become really big. taking more than 3 seconds often
let evenCount = 0;
for (const elem of list) {
if (elem % 2 === 0) {
evenCount++;
}
}
console.log(evenCount);
我知道这会在它执行的整个过程中阻塞事件循环。尝试计算内部承诺,即
const determineEvenCount = async list => {
return new Promise((resolve, reject) => {
let evenCount = 0;
for (const elem of list) {
if (elem % 2 === 0) {
evenCount++;
}
}
resolve(evenCount);
});
};
事件循环还会被阻塞吗?如果是,如何让它畅通无阻?
【问题讨论】:
-
是的,它会阻塞。您可以使用 webWorkers,但对于如此微不足道的事情,我感觉 IPC 消息传递开销会一样长。不过 3 秒,这个数组有多大,你确定是这个需要那么长时间吗?
-
你可以分块执行它并等待每个 x 元素或 ms 的简单任务(例如
await new Promise(res => setImmediate(res));)。
标签: javascript node.js event-loop