2017-07-19 14 views
-1

2つの異なるAPIエンドポイントからデータを取得する必要があります。両方のデータをフェッチした後、これらのデータで何かを行う必要があります。複数のAPI呼び出しを同期

私は1つのAPIからデータを取得する方法を知っていますし、コールバック関数を呼び出してデータで何かを行うようにしています。私はこれを次のようにしています。これらは、他のAPIに接続するオプションもあり、いつでもデータと呼ばれるになるだろう、単一のコールバック関数を持っているでしょう

var options2 = { 
     host: "api.mydata2.org", 
     port: 8080, 
     path: "/otherdata/users/3", 
     method: "GET" 
    } 

:私はのようなものを持ちたいだろうか今

function getJSON(options, cb) { 
    http.request(options, function(res){ 
     var body = ""; 

     res.on("data", function(chunk){ 
      body += chunk; 
     }); 

     res.on("end", function(){ 
      var result = JSON.parse(body); 
      cb(null, result); 
     }); 

     res.on("error", cb); 
    }) 
    .on("error", cb) 
    .end(); 
} 

var options = { 
    host: "api.mydata1.org", 
    port: 8080, 
    path: "/data/users/3", 
    method: "GET" 
} 

getJSON(options, function(err, result) { 
    if (err) { 
     return console.log("Error getting response: ", err); 
    } 

    // do something with the data 

}); 

からの両方のAPIが読み込まれます。どうやってやるの?

+0

約束を見てください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promisesこのトピックは、Stack Overflowで広くカバーされています。 [JavaScriptはすべての非同期呼び出しが終了するまで待つ](https://stackoverflow.com/q/34205266/218196) –

答えて

0

私は、非同期操作を表し、あなたはそれらの両方が行われたときに、その後を追跡するためにPromise.all()を使用し、その結果にアクセスすることができます約束を返すrequest-promiseモジュールを使用することをお勧めしたい:

const rp = require('request-promise'); 

function getJSON(options) { 
    return rp(options).then(body => { 
     return JSON.parse(body); 
    }); 
} 

let options1 = { 
    host: "api.mydata1.org", 
    port: 8080, 
    path: "/data/users/3", 
    method: "GET" 
}; 

let options2 = { 
     host: "api.mydata2.org", 
     port: 8080, 
     path: "/otherdata/users/3", 
     method: "GET" 
}; 

Promise.all([getJSON(options1), getJSON(options2)]).then(results => { 
    // process results here 
    console.log(results[0]);  // from options1 request 
    console.log(results[1]);  // from options2 request 
}).catch(err => { 
    // process error here 
    console.log(err); 
}); 

あなたが読むことができます約Promise.all()on MDN。 Web上の一般的な約束についての記事やチュートリアルがたくさんあります。ここにはoneがあります。それらはES6 Javascriptの標準であり、数年にわたってライブラリを通じてES5で利用可能になっています。非同期操作を管理または調整するために、Javascript言語で選択されたスキームです。 Javascriptで非同期プログラミングを行っている場合(ほとんどすべてのnode.jsプログラミングがそうです)、約束を学ぶ必要があります。

+0

@wesleyy - これはあなたの質問に答えますか?そうであれば、回答の左側にある緑色のチェックマークをクリックすることでコミュニティにその旨を示すことができ、それによって評判のポイントも得られます。 – jfriend00

関連する問題