0

ノード アプリケーションに Express と async.js を使用しています。app.js に次のコードがあります。

var resultObject = {};

app.get('/average', function(req, res) {
  async.series([
    function(callback) {
  //This does some complex computations and updates the resultObject
      routes.avg(req.query.url, resultObject);
      console.log('1');
      callback();
    }
    ,
    function(callback) { 
      res.send(resultObject);
      console.log('2');
      callback();
    }
  ]);
});

問題は、最初の関数の複雑な計算が完了する前に res.send(...) が起動することです。したがって、送信されたオブジェクトは空です。コードにエラーがありますか、それとも async.js を正しく使用していませんか?

4

2 に答える 2

1

あなたのコメントによると、問題はあなたのroutes.avgメソッドが非同期であることです。これは、メソッドが実行されるが、プログラムの続行をブロックしないことを意味します。つまり、シリーズの 2 番目のクロージャーは、最初のクロージャーの直後に呼び出されます。

問題は、async.series呼び出しのクロージャーが順不同で呼び出されていることではなく、クロージャー 1が終了callbackする前に実行されないようにするものが何もないことです。routes.avg

これを修正するにはcallbackroutes.avg呼び出しに を渡し、メソッドを編集してroutes.avg、すべての計算が完了したときにコールバック クロージャーを呼び出すようにします。callbackそうすれば、クロージャ 1 に渡されたものがroutes.avgメソッドによって呼び出されるまで、シリーズの 2 番目のクロージャは実行されません。

メソッドを変更するアクセス権がない場合は、非同期からクロージャー 1 に渡されroutes.avgたパラメーターを呼び出す前に、それがいつ完了したかを検出する別の方法を見つける必要があります。callback

于 2013-07-24T15:08:58.810 に答える
0

おそらく次のようなことを試してください:

async.series([
  function(callback) {
    routes.avg(req.query.url, resultObject);
    console.log('1');
    callback();
  },
  function(callback) { 
    console.log('2');
    callback();
  }
],
function(err, results){
   if(!err)
     res.send(resultObject);
   else
     //do something here for error?
});
于 2013-07-24T14:04:29.983 に答える