In order to improve your code, the definition of executeAsyncTask should be like this:
async function executeAsyncTask () {
  try {
    const res1 = await func1(a,b,c)
    const res2 = await func2(a,b,c)
    const res3 = await func3(a,b,c)
    return [res1, res2, res3]; // Return all values from 'each await' as an array
  } catch (err) {
      throw 'Promise Rejected';
  }
}
As you can see, it uses try and catch even to handle the errors. In other words, if one of the await functions is rejected, then catch throws the error automatically.
// This 'func1 code' from 'Carl Edwards' is the same
func1(a, b, c) {
  return new Promise((resolve, reject) => {
    promise_API_CALL(params, function(data, err) {
      if (err) {
        console.error(err)
        reject(err);
      }
      console.log(data);
      resolve(data);
    });
    //so work here...
    console.log("termined")
  });
}
And finally you call executeAsyncTask like this:
executeAsyncTask().then(function(result) {
    console.log("result => " + result); // Result of 'res1, res2, res3'
}).catch(function(error) {
    console.log("error => " + error); // Throws 'Promise Rejected'
});
And remember:
- Every - asyncfunction returns a- Promiseobject. The- awaitstatement operates on a- Promise, waiting until the- Promise- resolves or- rejects.
 
- You can use - awaitas many times as you like.
 
BONUS:
If you want all your promises (func1, func2, func3) execute in parallel (not one after another), you can modify your executeAsyncTask function like this:
async function executeAsyncTask () {
  try {
    return [ res1, res2, res3 ] = await Promise.all([
        func1(a,b,c),
        func2(a,b,c),
        func3(a,b,c)
    ])
  } catch (err) {
      throw 'Promise Rejected';
  }
}