2012-04-18 23 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