通常,我们可以为数组和对象执行循环来迭代属性/值。但循环阻塞。但是,超时可用于模拟异步循环。 i managed to do it for an array
//do stuff
(function asyncLoop(i){
//do stuff in the current iteration
if(++i < array.length){
setTimeout(function(){asyncLoop(i);}, 1);
} else {
callback();
}
}(0));
//do stuff immediately after, while looping
但是这个模型仅在数组中循环时有效,其中有一个限制器 - 传递的i
。有没有办法在一个对象上做这个?让我们说这个对象有50k的密钥来迭代,使它不合理地长。
我已经知道这个setImmediate
(afaik,只有更新的IE)和WebWorkers(还没有在IE中),但我只是想知道是否可以在一个上使用相同的策略对象
答案 0 :(得分:6)
没有具有异步功能的属性迭代器,因为没有办法保存除for (key in obj)
循环之外的迭代器中的状态,并且您已经知道它不是异步兼容的。
因此,只需将对象的所有键收集到一个数组中,并使用相同的机制迭代键数组。数组的优势在于它们可以通过跟踪数组索引来保存迭代中的状态。
可以使用Object.keys(obj)
ES5方法(通过内置方法或ES5垫片,如果需要)获取所有密钥,或者如果您不使用ES5填充程序,则可以自己收集密钥:
var keys = [];
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
keys.push(i);
}
}