承诺{<pending>} - 试图等待.map

时间:2017-09-06 10:09:46

标签: node.js asynchronous

我正在使用.map来映射新对象并​​将旧价格添加到地图中。

我正在使用Async / Await和我的数据图,这是我的代码:

let datasets = await changes.map(async (data) => {
  let products = {};
  let last = await models.prices.findOne({
    where: {
        productId: data.productId,
        sourceId: data.sourceId
    },
    order: [['createdAt', 'DESC']],
    limit: 1,
    offset: 1
  });

  products.name   = data.product.name;
  products.price  = data.price;
  products.sku    = data.product.sku;
  products.source = data.source.name;
  products.link   = data.link;
  products.diff   = last.price;


  return products;
});

changes是过去24小时内发现的所有价格变化。

last包含上一次特定产品的价格变化。

return products不等待,因此我收到了Promise { <pending> }条消息的垃圾邮件。如果我使用console.log(last)它在里面工作,但我无法弄清楚减慢回报的正确方法。

products.diff = last.price是需要填写的有效内容。有什么想法吗?

1 个答案:

答案 0 :(得分:7)

await等待Promises,但Array.prototype.map返回一个新的Promise数组。你需要用Promise.all

包装它
let datasets = await Promise.all(changes.map(async (data) => {
  let products = {};
  let last = await models.prices.findOne({
    where: {
        productId: data.productId,
        sourceId: data.sourceId
    },
    order: [['createdAt', 'DESC']],
    limit: 1,
    offset: 1
  });

  products.name   = data.product.name;
  products.price  = data.price;
  products.sku    = data.product.sku;
  products.source = data.source.name;
  products.link   = data.link;
  products.diff   = last.price;


  return products;
}));