在返回之前等待asynchronous完成

mongoosejsasynchronous代码。

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

我知道isPresent是在this.count async函数调用callback之前返回的,所以它的值是未定义的。 但我如何等待callback改变isPresent的价值,然后安全地返回?

什么效果呢(function(){ asynccalls() asynccall() })(); 在asynchronousstream程中。 如果var foo = asynccall() or (function(){})()会发生什么?

可以process.nextTick()帮助?

我知道有很多像这样的问题,但没有解释asynchronous完成之前返回的问题

没有办法做到这一点。 您需要更改函数的签名来进行callback,而不是返回值。

使IOasynchronous是Node.js的主要动机之一,等待asynchronous调用完成将会失败。

如果你给了我更多关于你想要实现的上下文,我可以给你一些关于如何使用callback来实现它的指针。

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

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

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

我有一个地方使用所有的testing准备客户端的HTTPS请求(填写正确的标题,validation,与cookie等)。 它看起来像这个或多或less:

 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次尝试一次这个客户端被一个testing请求执行一个请求 – 所以整个套件将会很快运行,每个5次请求都会等待ddos模块考虑我的请求不可由太多请求错误。

我在这里search了大部分有关asynchronous和其他库或实践的条目。 所有这些都需要callback – 这意味着我将不得不重新编写几百个testing用例。

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

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