我试图找到一种最简单的方法来实现一种等待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循环。
此路线将获取当天的价格变化行数,然后获取先前行的价格差异并将其添加到数组中。之后它应该将修改后的数组推送到最后一个。然后从那里转到我的模板。
我在这里看到了很多选择,但它开始变得混乱。所以我想从这里得到一些建议。
答案 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 })
})
})