我试图返回 MongoDB 中是否已存在用户。在 collection.find()
中运行 console.log
会打印正确的金额(大于 0)。但是,当调用 userExists
时,它始终返回 false
(0)。
如何让 Javascript 等待这些函数完成后再返回值?我读过有关 jQuery 的 $.Deffered()
的内容,但这对我来说感觉很脏,而且不起作用。
function userExists(db, uid){
var collection = db.get('users');
var ret = 0;
collection.find({"uid":uid},{},function(e,docs){
ret = docs.length
});
return ret > 0?true:false;
}
最佳答案
正如一些人所指出的,collection.find
是异步的,因此当您到达 userExists
中的下一行时(return ret 所在的行) > 0?true:false;
),还为时过早,ret
的值尚未设置。在 collection.find
回调(以及它依次调用的任何函数)之外的任何地方,查询都还没有发生。
(基本上)没有办法在查询之后“暂停”userExists
,因此您需要更改整个方法。您需要的是延续模式。这意味着无论您对collection.find
的结果做什么都必须在回调中发生。
我不知道您想用 ret
做什么,因此这可能意味着您的代码组织方式将发生重大变化。以下是我希望能给您提供总体思路的概述:
function processResultAndDisplayToTheUser(ret) {
//everything that needs to happen after the value of ret is set
if (ret > 0) {
doSomething();
} else {
doSomethingElse();
}
}
function userExists(db, uid){
var collection = db.get('users');
//ret doesn't exist here
collection.find({"uid":uid}, {}, function(e,docs){
var ret = docs.length;
//ret finally exists, so pass it to a function and use it
processResultAndDisplayToTheUser(ret);
});
//ret doesn't exist here either
}
//ret still doesn't exist here
关于javascript - Nodejs 函数在内部函数完成之前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808590/