"异步"循环遍历javascript中的对象

Jos*_*eph 4 javascript asynchronous

通常,我们可以为数组和对象执行循环以迭代属性/值.但循环阻塞.但是,超时可用于模拟异步循环.我设法为阵列做了.

//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
Run Code Online (Sandbox Code Playgroud)

但是这个模型只有在数组中循环时才有效,其中有一个限制器 - i它会被传递.有没有办法在一个对象上做这个?让我们说这个对象有50k键来迭代,使它不合理地长.

我已经知道这个setImmediate(afaik,只有更新的IE)和WebWorkers(还没有在IE中),但我只是想知道是否可以在一个对象上使用相同的策略.

jfr*_*d00 8

没有异步功能的属性迭代器,因为除了for (key in obj)循环之外没有办法保存迭代器中的位置状态,并且您已经知道它不是异步兼容的.

因此,只需将对象的所有键收集到一个数组中,并使用相同的机制迭代键数组.数组的优势在于它们确实有一种方法可以通过跟踪数组索引来保存迭代中的状态.

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

var keys = [];
for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
        keys.push(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Joseph:是的,它确实意味着循环(无论你是这样做,还是使用`Object.keys`来做),但是即使对象具有*真正大量*的属性,构建也不会花费很长时间数组.大概你希望这个异步的原因是你每个条目*做*的时间都需要时间. (2认同)