对于在Sequelize中交易链接的承诺中的循环

时间:2018-04-11 15:18:22

标签: javascript node.js promise sequelize.js

我正在构建一个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")})
    })

1 个答案:

答案 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将被拒绝