NodeJS:等待for循环的最简单方法

时间:2017-07-31 10:35:20

标签: node.js express

我试图找到一种最简单的方法来实现一种等待for循环在Node上完成的方法。我的设置是NodeJS + ExpressJS + SequelizeJS。

以下示例使用路线:

router.get('/today', function(req, res, next){

  /* Get all created rows today */
  models.prices.findAll({
    order: [['createdAt', 'DESC']],
    limit: 10,
    where: Sequelize.where(
      Sequelize.fn('DATE', Sequelize.col('createdAt')),
      Sequelize.literal('CURRENT_DATE')
    )
  }).then(function(changes){


    /* Get price difference per sourceId & productId */
    for (let i = 0; i < changes.length; i++) {
      models.prices.findOne({
        where: {
            productId: changes[i].productId,
            sourceId: changes[i].sourceId
        },
        order: [['createdAt', 'DESC']],
        limit: 1,
        offset: 1
      }).then(function(difference){
        /* Add price difference to array */
        changes[i]['difference'] = (changes[i].price - difference.price).toFixed(2);
      });
    }


    /* RETURN updated changes array here? */

  }).then(function(changes){
    res.render('today', {
      changes: changes
    });
  });
});

我是Async / Await的新手,所以我很难找到一种方法将它实现到这条Express路线中(假设这是我唯一的选择) - 因为看起来你不能做一个然后在一个循环上,因为它不是一个承诺。 /* RETURN updated changes array here? */是我返回更改的地方,但是如果我在那里返回更改,它显然会返回未更新的更改,因为它没有等待for循环。

此路线将获取当天的价格变化行数,然后获取先前行的价格差异并将其添加到数组中。之后它应该将修改后的数组推送到最后一个。然后从那里转到我的模板。

我在这里看到了很多选择,但它开始变得混乱。所以我想从这里得到一些建议。

2 个答案:

答案 0 :(得分:1)

为您的代码添加async / await对。看看它是否适合你。

router.get('/today', async function(req, res, next) {

    let changes = models.prices.findAll({
        order: [['createdAt', 'DESC']],
        limit: 10,
        where: Sequelize.where(
            Sequelize.fn('DATE', Sequelize.col('createdAt')),
            Sequelize.literal('CURRENT_DATE')
        )
    });

    /* Get price difference per sourceId & productId */
    for (let i = 0; i < changes.length; i++) {
        let difference = await models.prices.findOne({
            where: {
                productId: changes[i].productId,
                sourceId: changes[i].sourceId
            },
            order: [['createdAt', 'DESC']],
            limit: 1,
            offset: 1
        });
        /* Add price difference to array */
        changes[i]['difference'] = (changes[i].price - difference.price).toFixed(2);
    }

    /* RETURN updated changes array here? */
    res.render('today', {
      changes: changes
    });

});

答案 1 :(得分:0)

您可以尝试使用promises数组

来解决此映射更改数组
router.get('/today', function (req, res, next) {
  /* Get all created rows today */
  models.prices.findAll({
    order: [['createdAt', 'DESC']],
    limit: 10,
    where: Sequelize.where(
      Sequelize.fn('DATE', Sequelize.col('createdAt')),
      Sequelize.literal('CURRENT_DATE')
    )
  })
  .then(function(changes) {
    let getPriceDifferencePromises = changes.map(function (change) {
      return new Promise(function (resolve, reject) {
        return models.prices.findOne({
          where: {
              productId: change.productId,
              sourceId: change.sourceId
          },
          order: [['createdAt', 'DESC']],
          limit: 1,
          offset: 1
        })
        .then(function (difference) {
          change.difference = (change.price - difference.price).toFixed(2)
          return change
        })
      })
    })

    // Start parallele promises
    return Promise.all(getPriceDifferencePromises)
  })
  .then(function (changes) {
    res.render('today', { changes: changes })
  })
})