您好我使用sequelize并且我想进行同步查询,但这是异步进行并返回错误的响应。 我有这段代码:
function(user) {
var allow = false;
return User.find({ where: { id: user.id},
include: [{
model: Plan,
attributes: ['id', 'name']
}]
}).then(function(u) {
if(!u) throw new Error("0 user not found");
user = u.dataValues;
var plan = user.plan.dataValues.name;
else if (plan == "Premium") allow = true;
console.log("allow", allow);
return allow;
}).catch(function(error){
console.log("error:::", error);
});
}
console.log('allow', allow);
正在打印true
但是当我调用该函数时,函数返回false
。
感谢您的帮助。
答案 0 :(得分:1)
您不能使异步代码同步,因此您将不得不处理异步性。
然而,它不是太困难,因为你的函数已经返回了一个承诺。您可以使用它将allow
变量传递给调用者:
yourFunction(user).then(function(allow) {
console.log('allow', allow);
});
答案 1 :(得分:-1)
我认为return allow;
语句是function(u) {}
内的.then()
函数的返回值,而不是function (user) {}
。
此外,User.find()
会返回一个承诺。如果你读到Promise,你会发现有一些方法可以解决你的问题。
这是一个:
var myFunc = function(user, callback) {
var allow = false;
User.find({ where: { id: user.id},
include: [{
model: Plan,
attributes: ['id', 'name']
}]
}).then(function(u) {
if(!u) throw new Error("0 user not found");
user = u.dataValues;
var plan = user.plan.dataValues.name;
else if (plan == "Premium") allow = true;
callback(null, allow);
}).catch(function(error){
callback(error);
});
}
然后你可以使用这个功能:
myFunc(user, function (err, allow) {
// Do not forget to handle error
// `allow` now could be used here
console.log(allow);
});