キャンセル

リクエストのキャンセル

Axios を呼び出す際に timeout プロパティを設定することで、 response に関するタイムアウトを処理します。

一部のケース(例:ネットワーク接続が利用できなくなった場合)では、 Axios 呼び出しは connection を早期にキャンセルすることでメリットがあります。キャンセルを行わない場合、 Axios 呼び出しは親コード/スタックがタイムアウトするまで待機し続ける可能性があります(サーバーサイドアプリケーションでは数分かかる場合もあります)。

Axios 呼び出しを終了するには、以下のメソッドを使用できます:

タイムアウトとキャンセルメソッド(例: signal )を組み合わせて、response に関するタイムアウトと connection に関するタイムアウトの両方に対応するべきです。

signal: AbortController

Axios は v0.22.0 から、fetch API のリクエストをキャンセルするために、AbortController をサポートしています:

const controller = new AbortController();

axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});
// リクエストのキャンセル
controller.abort()

タイムアウトを使用した最新の AbortSignal.timeout() API の例 [nodejs 17.3+]:

axios.get('/foo/bar', {
   signal: AbortSignal.timeout(5000) // 5秒後にリクエストを中止
}).then(function(response) {
   //...
});

タイムアウトのヘルパー関数を使用した例:

function newAbortSignal(timeoutMs) {
  const abortController = new AbortController();
  setTimeout(() => abortController.abort(), timeoutMs || 0);

  return abortController.signal;
}

axios.get('/foo/bar', {
   signal: newAbortSignal(5000) // 5秒後にリクエストを中止
}).then(function(response) {
   //...
});

CancelToken 非推奨

CancelToken を使用してリクエストをキャンセルすることもできます。

Axios のキャンセルトークン API は、撤回された cancelable promises proposal に基づいています。

この API は v0.22.0 から非推奨になっているため、新しいプロジェクトでは使用しないでください。

以下の例のように、 CancelToken.source ファクトリを使用して CancelToken を作成できます:

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // エラー処理
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// リクエストのキャンセル (メッセージパラメータは任意)
source.cancel('Operation canceled by the user.');

CancelToken コンストラクタに実行関数を渡すことで、 CancelToken を作成することもできます:

const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // 実行関数は、キャンセル関数をパラメータとして受け取ります
    cancel = c;
  })
});

// リクエストのキャンセル
cancel();

注: 同じ cancel token / signal を使用して、複数のリクエストをキャンセルできます

移行期間中は、同じリクエストであっても両方のキャンセル API を使用できます:

const controller = new AbortController();

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token,
  signal: controller.signal
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // エラー処理
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// リクエストのキャンセル (メッセージパラメータは任意)
source.cancel('Operation canceled by the user.');
// または
controller.abort(); // メッセージパラメータはサポートされていません