Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对于Sequelize中事务中链接的循环内承诺_Javascript_Node.js_Promise_Sequelize.js - Fatal编程技术网

Javascript 对于Sequelize中事务中链接的循环内承诺

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

我正在构建一个nodeJS、hapiJS和Sequelize(使用PostgreSQL)应用程序,当我在Sequelize事务中的承诺链中使用for循环时,会遇到一些问题

我想用目录列表中的不同内容查询我的数据库

我用Promise.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")})
    })
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}很高兴它帮助了您!你说得对,我只是复制粘贴了你的循环,没有改变核心,忘记了,谢谢!