Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在函数中执行异步工作,然后在完成时从该函数返回值?_Javascript_Node.js_Function_Asynchronous_Return - Fatal编程技术网

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

Javascript 如何在函数中执行异步工作,然后在完成时从该函数返回值?,javascript,node.js,function,asynchronous,return,Javascript,Node.js,Function,Asynchronous,Return,我使用的库要求我传入一个“validate”函数。在这个函数中,我需要验证一些输入,如果通过,则返回true;如果失败,则返回false 问题是,我需要检查数据库中是否存在用于此验证函数的用户,并且Mongoose会调用一个回调函数并返回结果。如果我return在回调函数中,它只是从回调函数返回,而不是从validate函数返回 ... validate: function (username) { User.findOne({ username: username }, functio

我使用的库要求我传入一个“validate”函数。在这个函数中,我需要验证一些输入,如果通过,则返回
true
;如果失败,则返回
false

问题是,我需要检查数据库中是否存在用于此验证函数的用户,并且Mongoose会调用一个回调函数并返回结果。如果我
return
在回调函数中,它只是从回调函数返回,而不是从validate函数返回

...
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.
    });
}

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

简短的回答:你不能

无论出于何种目的,JavaScript都是单线程的。是的,您有回调和多线程(
setTimeout
setInterval
,事件回调),但您不能跳出回调并返回同一个函数

...
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.
    });
}
我的建议是,在调用
validate
之前,尝试预处理此验证,这样您就可以在
validate

中使用“yay或ney”结果来实现此目的

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); 
})

方孔中的圆钉不起作用。你可以伪造async,但不能伪造sync.Dang。在调用此函数之前,我没有在数据库中搜索的值。为了完成这项工作,应该以何种方式修改库?如果可以的话,我会修改它并提交一个拉请求,但我不确定如何改变这种行为。传递给validate函数的参数之一是否应该是
done
回调或其他什么?我不知道工作流程,但您可以在更改值时(或在更改值之后)执行查找(因此在验证时您有一个校验和值),或者引入用户在验证可用之前需要执行的预步骤。(我知道您在节点中,但一个例子是,在用户按下用户名字段旁边的“检查”之前,提交按钮不会启用)我无法返回承诺。库希望验证函数返回true或false。