I've this function with map, how can call only when finish?
_.map(data,async function (el) {
if(Number.parseInt(el) != NaN && (el != null) && !isNaN(el)){
console.log('ID: ' el)
await scrapeDetails(el) // <--- need to wait finish and than go to next element in map
}
})
async function scrapeDetails(id){
// ... bla bla
}
CodePudding user response:
map
and other higher order functions have funky behaviors when given async...await
functions.
The best solution I found so far is using the for...of
syntax with await
.
Something like this:
for (const element of data) {
// do all operations here
}
CodePudding user response:
Collect the promises and resolve them with Promise.all(). They're all done when that's done.
const promises = _.map(data, function (el) {
if(Number.parseInt(el) != NaN && (el != null) && !isNaN(el)){
console.log('ID: ' el)
return scrapeDetails(el)
} else {
return Promise.resolve();
}
});
let allResults = await Promise.all(promises);
console.log('now we are done!')
CodePudding user response:
Or you can always use recursion.
const asyncProcess = async (array, index) => {
const value = array[index];
if (!value) return;
..
await scrapeDetails(el);
return asyncProcess(array, index 1);
}