虽然此代码正在运行但我无法做任何事情。循环是否存在异步方式?
// This object is very large
var listOfUsers = {};
for(var key in listOfUsers){
delete listOfUsers[key]
}
答案 0 :(得分:0)
循环是否存在异步方式?
没有。由于delete listOfUsers[key]
本身是一个同步操作,因此在该循环运行时无法执行任何其他操作。 JS解释器忙于执行循环并执行delete
操作。因为node.js中的Javascript是单线程的,所以每次只执行一组Javascript。在循环完成之前,您无法执行任何其他操作。
我觉得如果你只是想让listOfUsers
回到一个空对象而没有其他人拥有对原始对象的引用,你可以用这样替换现有的循环:
listOfUsers = {};
虽然速度会快得多。然后旧对象(及其属性)将被垃圾收集。
在极少数情况下,您可以通过将其操作分解为块并执行一个块,然后让事件循环运行然后执行另一个块来解决此类问题并减轻同步操作的影响。
例如,您可以执行以下操作:
// 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
添加任何新用户,直到完成此操作或将被删除。