【问题标题】:NodeJs - Async/Await inside async/awaitNodeJs - 异步/等待内的异步/等待
【发布时间】:2017-12-28 04:59:42
【问题描述】:

我有以下代码。我期望输出:START,Middle,Middle,END

但是我得到了这个 START,Middle,END,Middle

(仅供参考,价格数组在我的示例中有 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);

【问题讨论】:

    标签: node.js async-await


    【解决方案1】:

    将内部 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);
      });
    });
    

    【讨论】:

    • 仍然是相同的输出......我改变你说的“等待新的运输(obj)”到“返回新的运输(obj)”
    • 在我看来 Transport#save() 没有返回一个承诺,在这种情况下你需要用 Promise 构造函数包装它,因为它是一个回调样式的 API,或者参考可能会解释如何返回承诺的文档。
    • 没错……它不会返回承诺。我用一个承诺包装它,现在效果很好。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 2020-03-31
    • 2023-03-12
    • 1970-01-01
    • 2018-02-08
    • 2019-06-30
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多