8

通常,我们可以对数组和对象进行循环以遍历属性/值。但是循环正在阻塞。但是,超时可用于模拟异步循环。我设法为数组做到了

//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 中),但我只想知道是否可以在对象上使用相同的策略。

4

1 回答 1

12

没有支持异步的属性迭代器,因为除了for (key in obj)循环之外,没有其他方法可以保存迭代器中的状态,并且您已经知道它不兼容异步。

因此,只需将对象的所有键收集到一个数组中,并使用您已经必须遍历键数组的相同机制。数组的优点是它们确实有一种方法可以通过跟踪数组索引来保存迭代中的状态。

可以使用Object.keys(obj)ES5 方法(如果需要,通过内置方法或 ES5 垫片)获取所有密钥,或者如果您不使用 ES5 垫片,您可以自己收集它们:

var keys = [];
for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
        keys.push(i);
    }
}
于 2012-04-18T10:22:45.340 回答