Michalis
Michalis

Reputation: 6926

NodeJs - Async/Await inside async/await

I have the following code. I expect the output: START,Middle,Middle,END

but instead I get this START,Middle,END,Middle

(FYI prices array has 2 values in my example)

console.log("START");
await Promise.all(prices.map(async(price) => {
  let obj: any = {};    
  obj.normal = price.normal;

  await new Transport(obj).save(async (err: any, doc: any) => {
     console.log("Middle");
     price.transport_id = doc._id;
  });
}));

console.log("END");
console.log(prices);

Upvotes: 7

Views: 10222

Answers (1)

Patrick Roberts
Patrick Roberts

Reputation: 51766

Change the inner await to a return statement, otherwise prices.map() is generating an array of entries that are undefined instead of promises.

Since Transport#save() does not return a promise, you'll need to wrap it with a Promise constructor since it is a callback-style API, or refer to the documentation which may perhaps explain how to instead return a promise.

To wrap it, you could do something like this:

// ...
obj.normal = price.normal;

return new Promise((resolve, reject) => {
  new Transport(obj).save((err: any, doc: any) => {
    console.log('Middle');

    if (err) return reject(err);

    price.transport_id = doc._id;
    resolve(price);
  });
});

Upvotes: 5

Related Questions