我如何做一个函数的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( setTimeout
, setInterval
,事件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); })