nodejs 循环可以是异步的吗?

Could nodejs loop be asynchronous?

虽然此代码是 运行,但我无能为力。循环有异步方式吗?

// This object is very large
var listOfUsers = {};

for(var key in listOfUsers){
  delete listOfUsers[key]  
}

Is there asynchronous way for loops?

没有。由于 delete listOfUsers[key] 本身是同步操作,因此在该循环 运行ning 期间无法执行任何其他操作。 JS 解释器正忙于执行循环并执行 delete 操作。因为 node.js 中的 Javascript 是单线程的,所以一次只能执行一组 Javascript。在循环完成之前,您不能执行任何其他操作。

我突然想到,如果您只是想 listOfUsers 返回到一个空对象,而没有其他人持有对原始对象的引用,您也许可以用这个替换现有的循环:

listOfUsers = {};

while 会快很多。然后旧对象(及其属性)将被垃圾收集。


在极少数情况下,您可以通过将同步操作分成块并执行一个块,然后让事件循环 运行 然后执行另一个块来解决此类问题并减轻同步操作的影响。

例如,您可以这样做:

// remove all users, chunked to 100 at a time
// allowing the event loop to run between chunks
function removeUsers() {
    const chunkSize = 100;
    let usersToDelete = Object.keys(listOfUsers).slice(chunkSize);
    if (!usersToDelete.length) {
        // everything deleted, no more work to do
        return;
    } else {
    for (let key of usersToDelete) {
        delete listOfUsers[key];
    }
    // delete some more after other things get a chance to run in the event loop
    setTimeout(removeUsers, 20);
}

此方法的一个问题是您无法将任何新用户添加到 listOfUsers,直到完成此操作,否则他们将被删除。