3

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

我知道 isPresent 在 this.count 异步函数调用回调之前返回,所以它的值是 undefined 。但是我如何等待回调改变 isPresent 的值然后安全返回?

异步流中有什么影响 (function(){ asynccalls() asynccall() })();。如果 varfoo = asynccall() or (function(){})() 上面两个会让 return 等待会发生什么?

可以process.nextTick()帮忙吗?

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

4

2 回答 2

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.
    }
}
于 2013-04-01T02:31:13.257 回答
0

有同样的问题。我希望我的 mocha 测试运行得非常快(就像他们最初所做的那样),但同时在我的应用程序中存在并运行反 DOS 层。像最初那样运行这些测试非常快,我正在使用的 ddos​​ 模块开始响应 Too Many Requests 错误,导致测试失败。我不想仅仅出于测试目的而禁用它(我实际上希望进行自动化测试来验证 Too Many Requests 案例是否存在)。

我有一个地方供所有为 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​​ 模块认为我的请求不受惩罚由太多请求错误。

我在这里搜索了大多数关于 Async 和其他库或实践的条目。所有这些都需要进行回调——这意味着我将不得不重新编写数百个测试用例。

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

for(var i = 0; i < 200000; ++i) {
    try {
        fs.statSync('/path' + i);
    } catch(err) {
    }
};
于 2016-05-17T15:09:48.583 回答