NodeJs-在async/await内部使用Async/Await

7
我有以下代码。我期望的输出是:START,Middle,Middle,END
但我得到了这个START,Middle,END,Middle (FYI,我的示例中prices数组有2个值)
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);
1个回答

5
将内部的await替换为return语句,否则prices.map()会生成一个由undefined而不是promise组成的条目数组。
由于Transport#save()不返回promise,你需要使用Promise构造函数进行包装,因为它是一个回调式API,或者参考文档,文档可能解释了如何返回promise的方法。
要进行包装,你可以像这样做:
// ...
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);
  });
});

仍然会得到相同的输出.... 我按照您所说的将 "await new Transport(obj)" 更改为 "return new Transport(obj)" - Michalis
我觉得 Transport#save() 方法没有返回一个 Promise,因此你需要使用 Promise 构造函数将其包装起来,因为它是一个回调式的 API,或者参考文档,文档中可能会解释如何返回一个 Promise。 - Patrick Roberts
没错...它不返回一个 Promise。我用一个 Promise 包装它,现在运行得很好。谢谢。 - Michalis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接