Javascript 如何在承诺链中传递变量?

Javascript 如何在承诺链中传递变量?,javascript,node.js,Javascript,Node.js,我有这个承诺链。在第二个承诺中,我需要user,这是user.save返回的。我怎样才能在不打破承诺链的情况下得到它?我需要它是一个链,因为我需要最后一个承诺,以在调用函数时将正确的属性返回到承诺 我调用这样的方法: User.createRider(req.query).then((user) => { res.json(user); }); User = sequelize.define('user', {},{ classMethods: { c

我有这个承诺链。在第二个承诺中,我需要user,这是user.save返回的。我怎样才能在不打破承诺链的情况下得到它?我需要它是一个链,因为我需要最后一个承诺,以在调用函数时将正确的属性返回到承诺

我调用这样的方法:

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;
        }
    }
});
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;
            })
        }
    }
});

如果我正确理解您的需求,您可以尝试以下代码:

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;
        });
    });

如果我正确理解您的需求,您可以尝试以下代码:

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;
        });
    });

我想这就是你想要的:

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]));

我想这就是你想要的:

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]));

我不确定我是否完全理解您的代码/意图,但我认为您正在寻找这样的东西:

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;
        }
    }
});
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;
            })
        }
    }
});

我不确定我是否完全理解您的代码/意图,但我认为您正在寻找这样的东西:

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;
        }
    }
});
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;
            })
        }
    }
});

不,这将从错误的承诺链返回用户,为清楚起见,更新了问题。为什么是错误的承诺链?调用方仍将从上一个
then()
中获取返回的
用户
。我不知道此解决方案如何工作。savedUser不在第二个承诺的范围内。@NickLong是的。@Himmators调用者只关心返回的承诺何时得到履行,以及它将得到什么满足(这里,
return user
,但它可以是任何东西)。不管它是否是用承诺链创建的。不,这将返回来自错误承诺链的用户,为清楚起见,更新了问题。为什么是错误的承诺链?调用方仍将从上一个
then()
中获取返回的
用户
。我不知道此解决方案如何工作。savedUser不在第二个承诺的范围内。@NickLong是的。@Himmators调用者只关心返回的承诺何时得到履行,以及它将得到什么满足(这里,
return user
,但它可以是任何东西)。不管它是否是用承诺链创建的。你也可以发布addUserAttributes()的代码吗?我不想把它作为一个答案发布,因为你是专门询问承诺的,但我要说,这个问题很简单,很容易用async.js解决。我使用async.瀑布来解决这类问题。你也可以发布addUserAttributes()的代码吗?我不会将此作为一个答案发布,因为你是专门询问承诺的,但我要说,这个问题很简单,可以用async.js来解决。我使用async.瀑布来实现这类功能。