如何在函数中执行异步工作,然后在完成后从该函数返回值?

时间:2013-09-26 20:26:02

标签: javascript node.js function asynchronous return

我正在使用一个要求我传入“验证”功能的库。在这个函数中,我需要验证一些输入,如果它通过则返回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在完成后也会调用回调!

2 个答案:

答案 0 :(得分:2)

简短的回答:你不能。

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

我的建议是在调用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); 
})