我正在构建一个nodeJS,hapiJS和Sequelize(使用PostgreSQL)应用程序,并且当我在与Sequelize的事务中链接的promise中使用for循环时会遇到一些问题。
我想在内容列表中使用不同的内容查询我的数据库。
我已经使用Promises.all()或Promise.map()创建了一些解决方案,但我无法将其应用于我的问题。
有人能解释我正确的方向吗?
db.User.sequelize.transaction(function(t){
return db.User.findOrCreate({
where: {
name: request.payload.user.id
},
transaction: t
})
.then( userResult => {
return db.Order.findOrCreate({
where: {
userId : userResult[0].dataValues.userId,
code : request.payload.order.code,
brand : request.payload.order.brand,
date : request.payload.date
},
transaction: t
})
})
// ############## HERE ##################
.then( orderResult => {
console.log("I WILL BE PRINTED")
for (var i = 0; i < request.payload.content; i++){
console.log("I WILL NOT BE PRINTED")
db.Product.findOrCreate({
where :{ean : request.payload.content[i].product.ean},
transaction: t // FAIRE BOUCLE CONTENT
})
.then( productResult => {
return db.Info.findOrCreate({
where: {
//TODO : prefix et password
productId: productResult[0].dataValues.productId,
orderId: orderResult[0].dataValues.orderId
}
}).then( infoResult => {
console.log(productResult)
return db.Range.create({
infoId : infoResult[0].dataValues.infoId,
low : productResult[0].dataValues.offset,
high : request.payload.content[i].quantity
})
})
})
}
})
.then(res => { return console.log("ok")})
})
答案 0 :(得分:1)
这里的事情是你从来没有创造过承诺。你的循环根本不会返回一个承诺,Promise.all
只有在所有承诺都被解决后才会被激活。
由于您使用的是es6语法,因此您也可以使用map
方法而不是for
循环。这是一种更实用的方法。
这会导致类似:
Promise.all(request.payload.content.map(content => {
db.Product.findOrCreate({
where :{ean : content.product.ean},
transaction: t
})
})
如果您更喜欢坚持使用for循环,那么策略是相同的。将您的循环包装在promise.all
中,这将在查询中将所有返回的promise保存在数组中。当循环结束并且所有承诺都得到解决时,将触发promise.all
。请注意,如果单个承诺被拒绝,promise.all
将被拒绝