LoginSignup
7
11

More than 1 year has passed since last update.

複数の非同期レスポンスを処理する方法

Last updated at Posted at 2019-03-13

経緯

非同期で複数のサーバの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);
});

最後に

いかがだったでしょうか?良い記事だと思った方は「いいね」のクリックをお願いします。

まだまだ初心者なので、もっと良い方法があるなどあればコメントをいただけると助かります。

7
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11