你好,我正在使用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
。
你不能让异步代码同步,所以你必须处理异步性。
然而,它不是太困难,因为你的函数已经返回一个承诺。您可以使用它将allow
变量传递给调用者:
yourFunction(user).then(function(allow) {
console.log('allow', allow);
});
我认为return allow;
语句是.then()
内部function(u) {}
函数的返回值,而不是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);
});