メソッドasync.each()
は配列を並行して反復し、要素のインデックスを反復コールバックに提供しません。
したがって、次の場合:
function( done ){
async.each(
someArray,
function( item, cb ){
// ... processing
cb( null );
},
function( err ){
if( err ) return done( err );
// ...
done( null );
}
);
}
あなたArray.indexOf()
はそれを見つけるために使用できますが:
function( done ){
async.each(
someArray,
function( item, cb ){
// ... processing
var index = someArray.indexOf( item );
cb( null );
},
function( err ){
if( err ) return done( err );
// ...
done( null );
}
);
}
これには、配列の反復ごとに配列内のメモリ内検索が必要です。大規模な配列の場合、これによりすべてが非常に遅くなる可能性があります。
より良い回避策は、async.eachSeries()
代わりに使用して、自分でインデックスを追跡することです。
function( done ){
var index = -1;
async.eachSeries(
someArray,
function( item, cb ){
// index is updated. Its first value will be `0` as expected
index++;
// ... processing
cb( null );
},
function( err ){
if( err ) return done( err );
// ...
done( null );
}
);
}
を使用eachSeries()
すると、物事が正しい順序で行われることが保証されます。
async のメンテナが最初に選択する別の回避策は、Object.keys を使用して繰り返すことです。
function( done ){
async.each(
Object.keys( someArray ),
function( key, cb ){
// Get the value from the key
var item = someArray[ key ];
// ... processing
cb( null );
},
function( err ){
if( err ) return done( err );
// ...
done( null );
}
);
}
これが役立つことを願っています。