我如何做一个函数的asynchronous工作,然后完成后从该函数返回一个值?

我正在使用一个库,需要我通过一个“validation”function。 在这个函数中,我需要validation一些input,如果通过则返回true否则返回false 。 问题是,我需要检查用户是否存在数据库中的这个validation函数和mongoose调用callback与结果。 如果我在callback中返回,它只是从callback函数而不是我的validation函数返回。

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

我正在尝试使用asynchronous库来解决这个问题,但asynchronous时它也会调用一个callback! 任何帮助表示赞赏。

简短的回答:你不能。

对于所有的意图和目的, JavaScript是单线程的。 是的,你有callback和multithreading( setTimeoutsetInterval ,事件callback)的存在,但你不能跳出callback,并回到相同的function。

我的build议是在调用validate之前尝试预处理这个validation,所以你有一个“yay或ney”的结果在validate工作。

您可以使用承诺来实现这一点。

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

然后使用validation函数如下。

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