Javascript 如何在函数中执行异步工作,然后在完成时从该函数返回值?
我使用的库要求我传入一个“validate”函数。在这个函数中,我需要验证一些输入,如果通过,则返回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
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。