The method async.each()
will iterate the array in parallel, and it doesn't provide the element's index to the iterating callback.
So when you have:
function( done ){
async.each(
someArray,
function( item, cb ){
// ... processing
cb( null );
},
function( err ){
if( err ) return done( err );
// ...
done( null );
}
);
}
While you COULD use Array.indexOf()
to find it:
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 );
}
);
}
This requires an in-memory search in the array for EVERY iteration of the array. For large-ish arrays, this might slow everything down quite badly.
A better workaround could be by using async.eachSeries()
instead, and keep track of the index yourself:
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 );
}
);
}
With eachSeries()
, you are guaranteed that things will be done in the right order.
Another workaround, which is the async's maintainer's first choice, is to iterate with 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 );
}
);
}
I hope this helps.
async.each
should've done. Seriously, who forgets to add an index to an interation script? – Pignus