Javascript APIの呼び出し解除


質問する


ダウンロードロジックを作成しています.要求は以下の通り.
1.ダウンロードしていることを示します.
2.ダウンロードが完了したらお知らせします.
3.ダウンロードに失敗した場合、失敗通知を発行します.
4.ダウンロードのキャンセルボタンを追加し、ダウンロードの中断を可能にします.
1-3は非同期動作とtry catchでよく使われる方法です.
download()

const download = async () => {
	try {
    	openAlert(1, '다운로드 중입니다.')
    	await api.post( ... ) // 다운로드 api 요청
        closeAlert(1)
        openAlert(2, '다운로드가 완료되었습니다.')
    } catch(e) {
    	openAlert(3, '다운로드가 실패했습니다.')
    }
	
}
ただし,4の要求はapi応答が到達する前にネットワーク接続を切断することである.これらの要求を処理したことがないので,まとめの中で方法を探そうとした.

探索する


AbortController


MDN : AbortController
  • AbortControllerインタフェースでは、1つ以上のリクエストが中断されます.
  • サンプルコード
  • let controller;
    const url = "video.mp4";
    
    const downloadBtn = document.querySelector('.download');
    const abortBtn = document.querySelector('.abort');
    
    downloadBtn.addEventListener('click', fetchVideo);
    
    abortBtn.addEventListener('click', function() {
      
      // 4. controller의 abort함수를 실행시키면, fetch요청이 중단된다.
      if (controller) controller.abort();
      console.log('Download aborted');
    });
    
    function fetchVideo() {
      // 1. abortController를 생성한다.
      controller = new AbortController();
      
      // 2. controller의 시그널을 추출(?)한다.
      const signal = controller.signal;
      
      // 3. fetch에 signal을 연결한다.
      fetch(url, { signal })
        .then(function(response) {
          console.log('Download complete', response);
        })
        .catch(function(e) {
          console.log('Download error: ' + e.message);
        });
    }

    Axios Cancellation : AbortController


    正式な書類
    axiosは、AbortControllerを作成して信号を接続することもできます.
    // 1. controller 생성
    const controller = new AbortController();
    
    // 2. axios에 signal 연결
    axios.get('/foo/bar', {
       signal: controller.signal
    }).then(function(response) {
       //...
    });
    
    // 3. 중지
    controller.abort()
    AbortControllerはAxiosバージョン0.22.0以降をサポートしています.
    しかし、今私のaxiosバージョンは0.19.xなので、上記の方法は正常ではありません.
    したがって、axiosバージョンを更新するか、cancelTokenを使用する必要があります.

    Axios Cancellation : CancelToken


    cancelToken方式を使用します.
    // cancel token 생성
    const CancelToken = axios.CancelToken;
    const source = CancelToken.source();
    
    axios.post('/user/12345', {
      name: 'new name'
    }, {
      // cancel token 설정
      cancelToken: source.token
    })
    
    // cancel token과 연결된 호출 취소
    source.cancel('Operation canceled by the user.');

    キーワードの検索

  • axios cancel
  • axios cancellation
  • Axios API割込み
  • キャンセル
  • axios api
  • AbortController
  • Axios CancelToken