2013-04-01 165 views
2

mongoosejs异步代码。等待异步完成后返回

userSchema.static('alreadyExists',function(name){ 
    var isPresent; 
     this.count({alias : name },function(err,count){ 
     isPresent = !!count 
     }); 
    console.log('Value of flag '+isPresent); 
    return isPresent; 
}); 

我知道this.count异步函数调用回调之前,因此其价值是不确定的返回isPresent。但我如何等待回调改变isPresent的值,然后安全地返回?

(function(){ asynccalls() asynccall() })();在异步流程中有什么影响。 如果var foo = asynccall() or (function(){})() 会发生什么情况上面两个返回等待吗?

可以process.nextTick()有帮助吗?

我知道有很多这样的问题,但没有任何关于异步完成

回答

2

之前返回的问题解释有没有办法做到这一点。您需要更改函数的签名以进行回调,而不是返回值。

使IO异步是Node.js的主要动机之一,并等待异步调用完成失败的目的。

如果你给我更多关于你想要实现的内容,我可以给你指示如何用回调来实现它。

编辑:你需要的东西像下面这样:

userSchema.static('alreadyExists',function (name, callback) { 
    this.count({alias : name}, function (err, count) { 
     callback(err, err ? null : !!count); 
     console.log('Value of flag ' + !!count);  
    }); 
}); 

然后,你可以用它喜欢:

User.alreadyExists('username', function (err, exists) { 
    if (err) { 
     // Handle error 
     return; 
    } 

    if (exists) { 
     // Pick another username. 
    } else { 
     // Continue with this username. 
    } 
} 
+0

alreadyExists是一个函数,它检查用户给出的别名是否已经存在于db中,如果存在,他会得到一个备注来选择另一个。 –

+0

如果他们想要检查db中的某些内容,然后根据结果继续,可以做些什么? –

+0

感谢您的更新! 。这清除了很多东西,特别是它有多糟等待以及我对回调权力的无知 –

0

有同样的问题。我希望我的摩卡测试运行速度非常快(正如他们原来那样),但同时在我的应用程序中存在并运行反DOS层。正如他们原来的工作一样运行这些测试是疯狂的快速和我使用的ddos模块开始响应太多的请求错误,使测试失败。我不想仅仅为了测试目的而禁用它(我实际上希望有自动化测试来验证“太多请求”情况也在那里)。

我有一个地方用于为HTTPS请求准备客户端的所有测试(填充正确的标头,通过身份验证,使用cookie等)。它看起来像这样或多或少:

var agent = thiz.getAgent(); 
thiz.log('preReq for user ' + thiz.username); 
thiz.log('preReq for ' + req.url + ' for agent ' + agent.mochaname); 

if(thiz.headers) { 
    Object.keys(thiz.headers).map(function(header) { 
     thiz.log('preReq header ' + header); 
     req.set(header, thiz.headers[header]); 
    }); 
} 
agent.attachCookies(req); 

,所以我想注入有睡眠会在每5次请求通过测试该客户端执行的请求踢 - 所以整个套件将很快运行,每第5个请求都会等待ddos模块考虑我的请求由于太多的请求错误而不能被禁止。

我搜索了大部分有关异步和其他库或实践的条目。他们都需要回调 - 这意味着我将不得不重新编写几百个测试用例。

最后,我放弃了任何优雅的解决方案,并堕落到为我工作的人。这是添加for循环试图检查不存在的文件的状态。它导致一个操作被执行足够长的时间,我可以校准它持续大约6500毫秒。

for(var i = 0; i < 200000; ++i) { 
    try { 
     fs.statSync('/path' + i); 
    } catch(err) { 
    } 
};