2017-07-31 60 views
0

我正试图找到最简单的方法来实现等待for循环完成节点的方法。我的设置是NodeJS + ExpressJS + SequelizeJS。NodeJS:等待for循环的最简单方法

下面的例子是使用路由:

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 
    }); 
    }); 
}); 

我的童话在异步/等待新的,所以我在努力寻找一种方法来实现它进入这个快速通道(假设这是我唯一的选择) - 因为看起来你不能只是做一个循环,因为它不是一个承诺。 /* RETURN updated changes array here? */是我要返回更改的地方,但是如果我在那里返回更改,它显然会返回未更新的更改,因为它没有等待for循环。

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

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

回答

1

为您的代码添加异步/等待对。看看这是否适合你。

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 
    }); 

}); 
+0

对不起,反应迟缓的数组,这为我节省了很多时间。我甚至没有想过将异步功能添加到路由的初始功能。完善! –

+0

不客气=)很高兴它的帮助。 – Val

0

你可以试着解决这个映射改变阵列与承诺

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 }) 
    }) 
})