1

我正在使用一个需要我传入“验证”函数的库。在这个函数中,我需要验证一些输入,然后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.
    });
}

我正在尝试使用异步库来解决这个问题,但是异步完成后也会调用回调!

4

2 回答 2

2

简短的回答:你不能。

出于所有意图和目的, JavaScript 都是单线程的。是的,您有回调并且存在多线程(setTimeout, setInterval, 事件回调),但是您不能跳出回调并返回同一个函数。

我的建议是在调用之前尝试预处理这个验证,validate这样你就有一个“yay or ney”的结果可以在validate.

于 2013-09-26T20:28:28.197 回答
0

你可以使用Promise来实现这一点。

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); 
})
于 2013-09-26T21:04:30.690 回答