2012-04-18 21 views
3

通常,我们可以为数组和对象循环遍历属性/值。但循环阻塞。但是,超时可用于模拟异步循环。 i managed to do it for an array。那被围绕通过i -通过javascript中的对象“异步”循环

//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 

但这种模式,同时在循环数组,那里有一个限制只适用。有没有办法做到这一点的对象?让我们只是说对象有50k个键来遍历,这使得它不合理地长。我只是想知道是否有可能在一个对象上使用相同的策略。但是我只想知道是否有可能在对象上使用相同的策略。

回答

6

没有异步功能的迭代器,因为没有办法保存迭代器中除for (key in obj)循环以外的状态,并且您已经知道该循环不是异步兼容的。

所以,只需将对象的所有键都收集到一个数组中,并使用您已经有的相同机制来遍历键数组。数组的优点是它们确实有办法通过跟踪数组索引来保存迭代中的状态。 (如果需要通过内置方法或ES5垫片)

人们可以得到所有的钥匙,无论是与Object.keys(obj) ES5方法也可以,如果你不以其他方式使用ES5垫片自己收集他们:

var keys = []; 
for (var i in obj) { 
    if (obj.hasOwnProperty(i)) { 
     keys.push(i); 
    } 
} 
+1

但这意味着循环通过对象只是将它们(或引用)放入数组中。 – Joseph 2012-04-18 10:24:58

+0

@Joseph - 是的,人们必须首先将属性收集到数组中。没有属性的异步迭代器。 – jfriend00 2012-04-18 10:25:55

+0

['Object.keys'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys)+ [es5-shim](https://github.com/kriskowal/es5- shim) – katspaugh 2012-04-18 10:29:28