简体   繁体   中英

How to pass on variables in promise-chain?

I have this promise-chain. in the second promise, I need user, that is returned by user.save. How can I get it without breaking the promise-chain? I need it to be one chain because I need the last promise to return the right attribute to the promise of when the function is called.

I call a method like this:

User.createRider(req.query).then((user) => {
    res.json(user);
});



User = sequelize.define('user', {},{
    classMethods: {
        createRider: function(params) {
            var values = [],
                userAttributes = sequelize.models.userAttributes,
                user = User.build(),
                name = userAttributes.build({name: 'name', value: params.name}),
                fbprofile = userAttributes.build({name: 'fbprofile', value: params.fbprofile}),
                phone = userAttributes.build({name: 'phone', value: params.phone});

            user = user.save()
                    .then(sequelize.Promise.all([
                            fbprofile.save(),
                            name.save(),
                            phone.save()
                        ])
                    )
                    .then((attributes) => {
                        user.addUserAttributes(attributes);
                        return user;
                    });
            return user;
        }
    }
});

If I understand correctly what yoy need, you can try smth like this code:

user = user.save()
    .then(savedUser => {
        return sequelize.Promise.all([
            fbprofile.save(),
            name.save(),
            phone.save()
        ])
        .then((attributes) => {
            console.log(savedUser); // this guy

            user.addUserAttributes(attributes);
            return user;
        });
    });

I think something like this is what you are looking for:

user = user.save();
let seq = user.then(sequelize.Promise.all([
    fbprofile.save(),
    name.save(),
    phone.save()
]));

return Promise.all([user,seq])
    .then((results) => result[0].addUserAttributes(results[1]));

I'm not sure, wether I entirely understand your code/intentions, but I think you're looking for sth. like this:

User = sequelize.define('user', {},{
    classMethods: {
        createRider: function(params) {
            var userAttributes = sequelize.models.userAttributes;
            var attrs = [
                {name: 'name', value: params.name},
                {name: 'fbprofile', value: params.fbprofile},
                {name: 'phone', value: params.phone},
            ];

            return sequelize.Promise.all(Array.prototype.concat(
                User.build().save(),
                attrs.map(o => userAttributes.build(o).save())
            )).then(([user, ...attributes]) => {
                user.addUserAttributes(attributes);
                return user;
            })
        }
    }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM