我正在使用一个要求我传入“验证”功能的库。在这个函数中,我需要验证一些输入,如果它通过则返回true
,如果失败则返回false
。
问题是我需要检查数据库中是否存在此验证函数的用户,并且Mongoose使用结果调用回调。如果我在回调中return
,它只是从回调函数而不是我的验证函数返回。
...
validate: function (username) {
User.findOne({ username: username }, function (err, user) {
if (user)
// User exists so we should return false from the validate function
else
// User does not exist so we should return true from validate.
});
}
我正在尝试使用异步库来解决这个问题,但async在完成后也会调用回调!
答案 0 :(得分:2)
简短的回答:你不能。
出于所有意图和目的 JavaScript是单线程的。是的,你有回调和多线程(setTimeout
,setInterval
,事件回调)的存在,但是你不能跳出回调并返回同一个函数。
我的建议是在调用validate
之前尝试预处理此验证,这样您就可以在validate
内使用“yay或ney”结果。
答案 1 :(得分:0)
您可以使用promises来实现此目标。
var q = require('q');
validate: function (username) {
var deferred = q.defer();
User.findOne({ username: username }, function (err, user) {
if (err){return deferred.reject(err)}
if (user)
// User exists so we should return false from the validate function
deferred.resolve(false);
else
// User does not exist so we should return true from validate.
deferred.resolve(true)
});
return deferred.promise;
}
然后使用如下的验证功能。
validate('username').then(function(result){
if (result)
console.log('user doesnt exist');
else
console.log('user exists');
}, function(err){
if(err)
console.log('Error', err);
})