在Sequelize中使用循环和承诺

Ret*_*ero 15 javascript node.js promise express sequelize.js

我目前正在构建一个Nodejs,Express,Sequelize(与PostgreSQL)应用程序,并且在使用promises以及事务和循环时遇到了一些问题.

我试图弄清楚如何在事务中使用for循环.我试图循环遍历成员列表并在数据库中为每个成员创建一个新用户.

我知道以下代码是错误的,但它显示了我想要做的事情.

谁能指出我正确的方向?

        var members = req.body.members;
        models.sequelize.transaction(function (t) {
            for (var i = 0; i < members.length; i++) {
                return models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}).then(function(user) {
                    return user.addInvitations([group], {transaction: t}).then(function(){}).catch(function(err){return next(err);});
                })
            };
        }).then(function (result) {
            console.log("YAY");
        }).catch(function (err) {
            console.log("NO!!!");
            return next(err);
        });
Run Code Online (Sandbox Code Playgroud)

Dat*_*sik 31

你应该用一个 Promise.all

    var members = req.body.members;
    models.sequelize.transaction(function (t) {
        var promises = []
        for (var i = 0; i < members.length; i++) {
            var newPromise = models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t});
           promises.push(newPromise);
        };
        return Promise.all(promises).then(function(users) {
            var userPromises = [];
            for (var i = 0; i < users.length; i++) {
                userPromises.push(users[i].addInvitations([group], {transaction: t});
            }
            return Promise.all(userPromises);
        });
    }).then(function (result) {
        console.log("YAY");
    }).catch(function (err) {
        console.log("NO!!!");
        return next(err);
    });
Run Code Online (Sandbox Code Playgroud)

我不认为你需要catch在续集交易中,因为我认为它跳出了交易的捕获

抱歉格式化.在移动.

在运行.then之前,Promise.all将等待所有promises返回(或失败),并且.then回调将是来自每个数组的所有promise数据


Ben*_*aum 6

你需要使用bluebird的内置循环结构,它带有sequelize:

var members = req.body.members;
models.sequelize.transaction(t => 
  Promise.map(members, m => // create all users
    models.User.create({firstname: m, email: m, 'pending':true}, {transaction: t})
  ).map(user => // then for each user add the invitation
     user.addInvitations([group], {transaction: t}) // add invitations
)).nodeify(err); // convert to node err-back syntax for express
Run Code Online (Sandbox Code Playgroud)

  • 类型“PromiseConstructor”上不存在属性“map”。 (2认同)