経緯
非同期で複数のサーバのAPIへリクエストし、そのレスポンス情報を集約して1つのオブジェクトにする処理が必要になった。
Web検索で理想のかたちがヒットしなかったので、備忘も含めて記載します。
環境
Node.js
axios: 0.18.0
注目点(2019/03/14更新)
axios.all
axios.spread
Promise.all
実装方法(2019/03/14更新)
const axios = require('axios')
function getServers(addresses) {
return Promise.all(
addresses.map((address) =>
axios.get(`http://${address}/hogeapi`)
)
).then((responses) => {
const allResponse = {};
allResponse.servers = [];
for (const res of responses) {
// 必要ならこの辺でレスポンスを加工
allResponse.servers.push(res.data);
}
return Promise.resolve(allResponse);
}));
}
// IPの配列
const addresses = ["xx.xx.xx.xx", "yy.yy.yy.yy"];
getServers(addresses)
.then((allResponse) => {
// ここで集約したオブジェクトを取得
console.log(allResponse);
});
変更前のコード
const axios = require('axios')
function getServers(addresses) {
return axios.all(
addresses.map((address) =>
axios.get(`http://${address}/hogeapi`)
)
).then(axios.spread((...responses) => {
const allResponse = {};
allResponse.servers = [];
for (const res of responses) {
// 必要ならこの辺でレスポンスを加工
allResponse.servers.push(res.data);
}
return Promise.resolve(allResponse);
}));
}
// IPの配列
const addresses = ["xx.xx.xx.xx", "yy.yy.yy.yy"];
getServers(addresses)
.then((allResponse) => {
// ここで集約したオブジェクトを取得
console.log(allResponse);
});
最後に
いかがだったでしょうか?良い記事だと思った方は「いいね」のクリックをお願いします。
まだまだ初心者なので、もっと良い方法があるなどあればコメントをいただけると助かります。