1. 程式人生 > >詳解Axios 如何取消已傳送的請求

詳解Axios 如何取消已傳送的請求

這篇文章主要介紹了詳解Axios 如何取消已傳送的請求,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

最近在專案中遇到一個問題,在連續傳送同一請求時,如果第二次請求比第一次請求快,那麼實際顯示的是第一次請求的資料,這就會造成資料和我選擇的內容不一致的問題。解決的方案:在後續傳送請求時,判斷之前的請求是否完成(同一個介面),如果未完成則立即取消。然後在傳送新的請求。

Axios 介紹

Axios是一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。

Axios 使用 cancel token 取消請求

Axios的 cancel token API 基於cancelable promises proposal,它還處於第一階段。

可以使用 CancelToken.source 工廠方法建立 cancel token,像這樣:

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

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

// 取消請求(message 引數是可選的)
source.cancel('Operation canceled by the user.');

2.還可以通過傳遞一個 executor 函式到 CancelToken 的建構函式來建立 cancel token:

var CancelToken = axios.CancelToken;
var cancel;

axios.get('/user/12345', {
 cancelToken: new CancelToken(function executor(c) {
  // executor 函式接收一個 cancel 函式作為引數
  cancel = c;
 })
});

// 取消請求
cancel();

我自己在專案中用的是第二種方案:

提取所有的 api 進行封裝:

import request from '../utils/request' // 配置過的Axios 物件
import axios from 'axios' 

export function getLatenessDetailSize(params, that) { 
  return request({
    url: '/api/v1/behaviour/latenessDetailSize', 
    method: 'post',
    params: params,
    cancelToken: new axios.CancelToken(function executor(c) { // 設定 cancel token
      that.source = c;
    })
  })
}

export xxx

具體的業務元件:

import { getLatenessDetail } from "../api";
export default {
    data() {
      return {
        tableData: [],
        total: 0,
        page: 1,
        loadTable: false,
        params: { },
        source: null
      }
    },
    methods: {
      cancelQuest() {
        if (typeof this.source === 'function') {
          this.source('終止請求'); //取消請求
        }
      },
      getTableData(val) {
        this.cancelQuest() // 請求傳送前呼叫
        this.page = val
        this.loadTable = true
        getLatenessDetail(this.params, (val - 1) * 10, this)
          .then(
            res => {
              this.loadTable = false
              this.tableData = res.data
            }
        )
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援指令碼之家。

轉載於:https://www.jb51.net/article/149222.htm