0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[javascript]Axios並列処理方法

Posted at

Axiosとは?

Axiosはブラウザ、Node.jsのためのPromise APIを活用するHTTP非同期通信ライブラリです。 実務ではFetchApiよりAxiosをよく使うそうです。

Axiosの並列処理

login.js
import axios  from 'axios';

    // 省略
#onSubmit = e => {
    axios.post('/api/authentication', loginData)
      .then(result => {
        return result.data.result;
      })
      .then(({ id, token }) => {
        const options = { headers: { token } };
        this.#data.store.token = token;

        return axios.all([
          axios.get(`/api/user/${id}`, options),
          axios.get(`/api/user/${id}/posts`, options),
        ]);
      })

      .then(([profile, posts]) => {
        this.#data.store.userProfile = profile.data.result;
        this.#data.store.userPosts = posts.data.results;

        location.href = '/#/profile';
      })
      .catch(error => {      
        this.#loginFail = true;
        this.render();
      });
  }

上のロジックは、ログインフォームでログインボタンを押した時submitイベントが発生した時、呼び出される関数です。関数の内容では、ログイン認証に成功をすると、ログインユーザのプロフィール情報と書き込みを表示します。

axios.post()
axios.post('/api/authentication', loginData)
  .then(result => {
    return result.data.result;
  })

Axiosはpromiseをリターンするライブラリであるため、thenチェーンを使用しています。最初のthen()は成功したとき、呼び出されます。

axios.all(array) - api並列処理
.then(({ id, token }) => {
    const options = { headers: { token } };
    this.#data.store.token = token;

    return axios.all([
      axios.get(`/api/user/${id}`, options),
      axios.get(`/api/user/${id}/posts`, options),
    ]);
 })

ログインに成功したら、idとtokenを持ってユーザープロファイルと投稿情報を出力します。 そのためには、ユーザープロファイルapiと投稿情報apiを呼び出す必要があります。 この2つのapiを直列処理するよりも並列処理する方が時間的に節約できるので、api呼出方式を並列処理方式にした方が良いでしょう。
そのためにはaxios.all(array)を使います。

axios.all(array) - リターン処理
.then(([profile, posts]) => {
  this.#data.store.userProfile = profile.data.result;
  this.#data.store.userPosts = posts.data.results;

  location.href = '/#/profile';
})
.catch(error => {      
  this.#loginFail = true;
  this.render();
});

並列処理したapiの中で、誰が一番最初に終わるのかは分かりません。
並列処理したapi n個のapiがすべて完了したとき、次にthenを呼び出すことになります。
[profile, posts] この順序はaxios.all(array)のarrayの順序が保障されます。
catch()はapi通信結果が異常だった場合、この関数がキャッチします。

0
0
1

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?