“异步”循环遍历javascript中的对象

时间:2012-04-18 10:20:33

标签: javascript asynchronous

通常,我们可以为数组和对象执行循环来迭代属性/值。但循环阻塞。但是,超时可用于模拟异步循环。 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中),但我只是想知道是否可以在一个上使用相同的策略对象

1 个答案:

答案 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);
    }
}