使用 Sequelize findOne 方法在 Bluebird promise 中进行并发调用。 Returns 未定义
Making concurrent call in Bluebird promise using Sequelize findOne method . Returns undefined
我想验证来自多个表的特定用户数据是否存在,以使其成为我正在使用 Bluebird Promise.Prop 的并发调用,如下所示。使用 sequelize ORM 加入数据。
Promise.props({
user: (()=>{
return User.findOne({
where: {username: req.user.username}
});
}),
comments: (()=>{
return comments.findOne({
where: {username: req.user.username}
});
})
}).then((result)=> {
console.log(result.user.name, result.comments.count);
});
我也尝试过使用嵌套的 promise,但没有成功。喜欢
Promise.props({
user: (()=>{
return User.findOne({
where: {username: req.user.username}
}).then((user)=>{
console.log(user.name); // even here i am getting undefined
});
}),
comments: (()=>{
return comments.findOne({
where: {username: req.user.username}
});
})
}).then((result)=> {
console.log(result.user.name, result.comments.count);
});
您返回的是 Promise
本身,而不是解析值。结果需要在承诺决议中收集,然后传递。
// collect values in this object
const values = {};
// run all promises
Promise.all([
model.findOne()
.then((val) => {
// assign result 1
values.val1 = val;
return Promise.resolve();
}),
model.findOne()
.then((val) => {
// assign result 2
values.val2 = val;
return Promise.resolve();
}),
])
.then(() => {
// the values will be collected here.
console.log(values);
});
你不清楚是result.user
未定义,还是result.user.name
未定义。
我希望是后者。
您将带有 2 个键的对象传递给 Promise.props。
但是这两个键都是一个函数,而不是一个承诺。所以 promise.props 看到的是功能,而不是承诺。
结果应该仍然有 2 个函数。
尝试
Promise.props({
user: User.findOne({
where: {username: req.user.username}
}),
comments: comments.findOne({
where: {username: req.user.username}
})
}).then((result)=> {
console.log(result.user.name, result.comments.count);
});
其他好的方法是 Promise.all,或者如果您知道自己有多少承诺,则使用 Promise.join
Promise.join(
User.findOne({
where: {username: req.user.username}
}),
comments.findOne({
where: {username: req.user.username}
}),
(user, comment) => {
console.log(user.name, comments.count);
}
);
我想验证来自多个表的特定用户数据是否存在,以使其成为我正在使用 Bluebird Promise.Prop 的并发调用,如下所示。使用 sequelize ORM 加入数据。
Promise.props({
user: (()=>{
return User.findOne({
where: {username: req.user.username}
});
}),
comments: (()=>{
return comments.findOne({
where: {username: req.user.username}
});
})
}).then((result)=> {
console.log(result.user.name, result.comments.count);
});
我也尝试过使用嵌套的 promise,但没有成功。喜欢
Promise.props({
user: (()=>{
return User.findOne({
where: {username: req.user.username}
}).then((user)=>{
console.log(user.name); // even here i am getting undefined
});
}),
comments: (()=>{
return comments.findOne({
where: {username: req.user.username}
});
})
}).then((result)=> {
console.log(result.user.name, result.comments.count);
});
您返回的是 Promise
本身,而不是解析值。结果需要在承诺决议中收集,然后传递。
// collect values in this object
const values = {};
// run all promises
Promise.all([
model.findOne()
.then((val) => {
// assign result 1
values.val1 = val;
return Promise.resolve();
}),
model.findOne()
.then((val) => {
// assign result 2
values.val2 = val;
return Promise.resolve();
}),
])
.then(() => {
// the values will be collected here.
console.log(values);
});
你不清楚是result.user
未定义,还是result.user.name
未定义。
我希望是后者。
您将带有 2 个键的对象传递给 Promise.props。 但是这两个键都是一个函数,而不是一个承诺。所以 promise.props 看到的是功能,而不是承诺。 结果应该仍然有 2 个函数。
尝试
Promise.props({
user: User.findOne({
where: {username: req.user.username}
}),
comments: comments.findOne({
where: {username: req.user.username}
})
}).then((result)=> {
console.log(result.user.name, result.comments.count);
});
其他好的方法是 Promise.all,或者如果您知道自己有多少承诺,则使用 Promise.join
Promise.join(
User.findOne({
where: {username: req.user.username}
}),
comments.findOne({
where: {username: req.user.username}
}),
(user, comment) => {
console.log(user.name, comments.count);
}
);