2012-04-18 2 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 개라고 말하면서 부당하게 길게 만듭니다.

(afaik, 최신 IE 만 해당) 및 WebWorkers (IE에는 아직 없음)이 있지만, 객체에 대해 동일한 전략을 사용할 수 있는지 알고 싶습니다.

답변

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

+0

@Joseph - 예, 먼저 배열에 속성을 수집해야합니다. 속성의 비동기 반복자는 없습니다. – jfriend00

+0

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

관련 문제