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ます。これは渡されます。オブジェクトに対してこれを行う方法はありますか? オブジェクトが 5 万個のキーを繰り返し処理する必要があり、不当に長くなってしまうとしましょう。

私はすでにこれsetImmediate(afaik、新しいIEのみ)とWebWorkers(IEにはまだありません)を知っていますが、オブジェクトに対して同じ戦略を使用できるかどうかを知りたいだけです。

4

1 に答える 1

12

for (key in obj)ループ以外にイテレーターのどこにいるかの状態を保存する方法がなく、非同期に対応していないことが既にわかっているため、プロパティの非同期対応イテレーターはありません。

したがって、オブジェクトのすべてのキーを配列に収集し、キーの配列を反復処理する必要があるのと同じメカニズムを使用するだけです。配列には、配列インデックスを追跡するだけで、反復中の現在の状態を保存する方法があるという利点があります。

ES5 メソッド (組み込みメソッドまたは必要に応じて ES5 shim を使用) を使用してすべてのキーを取得するか、Object.keys(obj)ES5 シムを使用していない場合は自分でそれらを収集できます。

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