8

私の最初の「深刻な」Node.jsプロジェクトをビルドします(Expressを使用)。

いくつかのRESTAPIへのいくつかの呼び出しを使用し、すべての結果を収集し、それらをマッサージして、完全なJSONをクライアント(HTML5 + AJAX)に返す必要があります。

  1. APIAを呼び出す
  2. APIBを呼び出す
  3. API Aを再度呼び出します(Bの結果を使用)
  4. 3回の呼び出しの結果をJSONに処理する
  5. response.send(result)

簡単なパターン、解決策、またはモジュールがあり、適切にグーグルで検索しなかったと確信しています:)そのような操作をどこに配置するかについても意見をいただければ幸いです(「ルート」の下?個別のファイル?等。)

御時間ありがとうございます!

4

2 に答える 2

8

非同期モジュールは、この種のジョブに適合します。具体的には、async.waterfall関数を使用できます。

例:

async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback){
        callback(null, 'three');
    },
    function(arg1, callback){
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
   // result now equals 'done'    
});

編集します。ジョブ間に重要な依存関係がある場合は、async.autoを使用できます。要件に基づいて、関数を実行するための最適な順序を決定します。

于 2012-09-10T06:02:27.747 に答える
2

周りにはたくさんの制御フローライブラリがあります。以前のプロジェクトでQを使用しましたが、不満はありませんが、次のプロジェクトではcaolanの非同期ライブラリを使用することを検討します。

https://github.com/caolan/async

上で説明したことから、並列関数の使用を検討することをお勧めします。

https://github.com/caolan/async#parallel

あなたが説明する問題は、ドキュメントの並列の例に非常に簡単に転送できます

編集:API呼び出しが依存していることについて少し見逃しました。チェーンに沿って値を渡し、順序を制御する必要がある場合は常に、ウォーターフォール方式を使用する必要があります(qiaoの回答を参照)。呼び出しが独立している場合は、並列メソッドを使用します。並列方式の例を以下に示します。

async.parallel({
    google: function(callback){
      http.get("http://www.google.com", function(res){
        console.log("google done");
        callback(null, res.statusCode);
      })
    },
    yahoo: function(callback){
      http.get("http://www.yahoo.com", function(res){
        console.log("yahoo done");
        callback(null, res.statusCode);
      })    
    }
  },
  function(err, results) {
    if(!err){
      console.log("all done");
      console.log(results.google);
      console.log(results.yahoo);
    }else{
      console.log(err);
    }
  }
);

これにより、すべてのリクエストが並行して行われ、すべてのリクエストが完了したときにコールバックが提供されます。これは、データをマッサージする場所です。

制御フローライブラリのリスト:

https://github.com/joyent/node/wiki/Modules#wiki-async-flow

于 2012-09-10T06:04:41.263 に答える