Javascript 如何在承诺链中传递变量?
我有这个承诺链。在第二个承诺中,我需要user,这是user.save返回的。我怎样才能在不打破承诺链的情况下得到它?我需要它是一个链,因为我需要最后一个承诺,以在调用函数时将正确的属性返回到承诺 我调用这样的方法: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.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.瀑布来实现这类功能。