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の2番目の引数)は、指定された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 に答える