2

我有以下代码块:

async.parallel([
    function(cb){ module.rpc("user.data",{"username":data.username},cb); },
    function(cb){ module.rpc("group.list",{"username":data.username},cb); },
    function(cb){ module.rpc("set.list",{},cb); }
],function(error,result){
    if(error){ callback(error); return; }
    var user = result[0], groups = result[1], sets = result[2];
    callback(null,template.render({"user":user,"groups":groups,"sets":sets}));
});

module.rpc是一个通过 . 从服务器获取必要数据的函数socket.io。现在,最后一个函数(async.parallel的第二个参数)应该只在给定的 3 个函数回调后才被调用。但是,在模板(EJS)渲染期间,当我尝试访问时groups.data有时会收到错误消息:

Uncaught TypeError: Cannot read property 'data' of undefined

该代码对我来说似乎非常好,但只是偶尔有效。我已经多次重新加载页面,没有更改底层代码,成功率约为 20%。我完全不知道为什么这里出了问题。我只能猜测该变量的分配被延迟了。所以我尝试使用延迟渲染window.setTimeout,但无济于事。为什么会这样?我如何解决它?

4

1 回答 1

2

socket.io不断向服务器发送事件,直到它得到确认。根据服务器负载,确认可能不会立即生效。因此发送了多个相同的请求,并且由于async.parallel使用计数器而不是单独跟踪每个函数,最终函数被过早地调用。

于 2013-02-09T15:31:36.383 回答