Axios 如何取消已傳送的請求?
阿新 • • 發佈:2018-11-08
最近遇到一個問題,在連續傳送同一請求時,如果第二次請求比第一次請求快,那麼實際顯示的是第一次請求的資料,這就會造成資料和我選擇的內容不一致的問題。解決的方案:在後續傳送請求時,判斷之前的請求是否完成(同一個介面),如果未完成則立即取消。然後在傳送新的請求。
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.'); //歡迎加全棧開發交流君羊:864305860學習交流
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
}
)
}
}