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
,直到完成此操作,否则他们将被删除。
虽然此代码是 运行,但我无能为力。循环有异步方式吗?
// 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
,直到完成此操作,否则他们将被删除。