Javascript 对于Sequelize中事务中链接的循环内承诺
我正在构建一个nodeJS、hapiJS和Sequelize(使用PostgreSQL)应用程序,当我在Sequelize事务中的承诺链中使用for循环时,会遇到一些问题 我想用目录列表中的不同内容查询我的数据库 我用Promise.all()或Promise.map()找到了一些解决方案,但我无法将其应用于我的问题 谁能给我解释一下正确的方向吗Javascript 对于Sequelize中事务中链接的循环内承诺,javascript,node.js,promise,sequelize.js,Javascript,Node.js,Promise,Sequelize.js,我正在构建一个nodeJS、hapiJS和Sequelize(使用PostgreSQL)应用程序,当我在Sequelize事务中的承诺链中使用for循环时,会遇到一些问题 我想用目录列表中的不同内容查询我的数据库 我用Promise.all()或Promise.map()找到了一些解决方案,但我无法将其应用于我的问题 谁能给我解释一下正确的方向吗 db.User.sequelize.transaction(function(t){ return db.User.findOrCr
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")})
})
db.User.sequelize.transaction(函数(t){
返回db.User.findOrCreate({
其中:{
名称:request.payload.user.id
},
交易:t
})
。然后(userResult=>{
返回db.Order.findOrCreate({
其中:{
userId:userResult[0]。dataValues.userId,
代码:request.payload.order.code,
品牌:request.payload.order.brand,
日期:request.payload.date
},
交易:t
})
})
//这里##################
。然后(orderResult=>{
console.log(“我将被打印”)
对于(var i=0;i{
返回db.Info.findOrCreate({
其中:{
//TODO:前缀et密码
productId:productResult[0]。dataValues.productId,
orderId:orderResult[0]。dataValues.orderId
}
})。然后(infoResult=>{
console.log(productResult)
返回db.Range.create({
infoId:infoResult[0]。dataValues.infoId,
低:productResult[0]。dataValues.offset,
高:request.payload.content[i].数量
})
})
})
}
})
.then(res=>{return console.log(“ok”)})
})
这里的问题是,你从一开始就不会做出承诺。您的循环根本不返回承诺,并且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.all
将被触发。请注意,如果单个承诺被拒绝,promise.all
将被拒绝如果循环内部的console.log
未显示,则循环的条件存在一个问题。但是您需要使用Promise.all
或Promise.map
来解决它。为什么您认为它们不能应用于您的问题?@t.niese我的意思是,在findOrCreate
的异步调用完成之前,我没有成功地应用它们您调用resolve()
。而且findOrCreate
已经返回了一个承诺,因此无需将其包装成另一个承诺。感谢您的回复,它可以正常工作!您应该编辑行where:{ean:request.payload.content[i].product.ean}
where:{ean:content.product.ean}很高兴它帮助了您!你说得对,我只是复制粘贴了你的循环,没有改变核心,忘记了,谢谢!