await with array foreach containing async await

Array.prototype.forEach() tries to execute sequentially and you may not always get the expected result.

Array.prototype.map() is the widely used for creating Promises using data and then resolved using await Promise.all([])

using .map() function, all the promises are resolved in parallel and if you happen to call an API you may end up getting error 429: Too many Requests

To execute all the promises sequentially, you can use for ...of.

const array1 = ['a', 'b', 'c'];

for (const element of array1) {
  console.log(element);
}

MDN Reference


Use Array.prototype.map and Promise.all:

async function procesMultipleCandidates (data) {
  let generatedResponse = []
  await Promise.all(data.map(async (elem) => {
    try {
      // here candidate data is inserted into  
      let insertResponse = await insertionInCandidate(elem)  
      // and response need to be added into final response array 
      generatedResponse.push(insertResponse)
    } catch (error) {
      console.log('error'+ error);
    }
  }))
  console.log('complete all') // gets loged first
  return generatedResponse // return without waiting for process of 
}

Or use a for/of loop if you don't want the loop run concurrently:

async function procesMultipleCandidates (data) {
  let generatedResponse = []
  for(let elem of data) {
    try {
      // here candidate data is inserted into  
      let insertResponse = await insertionInCandidate(elem)  
      // and response need to be added into final response array 
      generatedResponse.push(insertResponse)
    } catch (error) {
      console.log('error'+ error);
    }
  }
  console.log('complete all') // gets loged first
  return generatedResponse // return without waiting for process of 
}