詳解Axios 如何取消已發(fā)送的請(qǐng)求
前言
最近在項(xiàng)目中遇到一個(gè)問題,在連續(xù)發(fā)送同一請(qǐng)求時(shí),如果第二次請(qǐng)求比第一次請(qǐng)求快,那么實(shí)際顯示的是第一次請(qǐng)求的數(shù)據(jù),這就會(huì)造成數(shù)據(jù)和我選擇的內(nèi)容不一致的問題。解決的方案:在后續(xù)發(fā)送請(qǐng)求時(shí),判斷之前的請(qǐng)求是否完成(同一個(gè)接口),如果未完成則立即取消。然后在發(fā)送新的請(qǐng)求。
Axios 介紹
Axios是一個(gè)基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。
Axios 使用 cancel token 取消請(qǐng)求
Axios的 cancel token API 基于cancelable promises proposal,它還處于第一階段。
可以使用 CancelToken.source 工廠方法創(chuàng)建 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 {
// 處理錯(cuò)誤
}
});
// 取消請(qǐng)求(message 參數(shù)是可選的)
source.cancel('Operation canceled by the user.');
2.還可以通過傳遞一個(gè) executor 函數(shù)到 CancelToken 的構(gòu)造函數(shù)來創(chuàng)建 cancel token:
var CancelToken = axios.CancelToken;
var cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
// executor 函數(shù)接收一個(gè) cancel 函數(shù)作為參數(shù)
cancel = c;
})
});
// 取消請(qǐng)求
cancel();
我自己在項(xiàng)目中用的是第二種方案:
提取所有的 api 進(jìn)行封裝:
import request from '../utils/request' // 配置過的Axios 對(duì)象
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) { // 設(shè)置 cancel token
that.source = c;
})
})
}
export xxx
具體的業(yè)務(wù)組件:
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('終止請(qǐng)求'); //取消請(qǐng)求
}
},
getTableData(val) {
this.cancelQuest() // 請(qǐng)求發(fā)送前調(diào)用
this.page = val
this.loadTable = true
getLatenessDetail(this.params, (val - 1) * 10, this)
.then(
res => {
this.loadTable = false
this.tableData = res.data
}
)
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue模板語法中數(shù)據(jù)綁定的實(shí)例代碼
這篇文章主要介紹了Vue模板語法中數(shù)據(jù)綁定的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05
Vue中的ref作用詳解(實(shí)現(xiàn)DOM的聯(lián)動(dòng)操作)
這篇文章主要介紹了Vue中的ref作用詳解(實(shí)現(xiàn)DOM的聯(lián)動(dòng)操作),需要的朋友可以參考下2017-08-08
vue監(jiān)聽頁面滾動(dòng)到某個(gè)高度觸發(fā)事件流程
這篇文章主要介紹了vue監(jiān)聽頁面滾動(dòng)到某個(gè)高度觸發(fā)事件流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue 2.0學(xué)習(xí)筆記之Vue中的computed屬性
本篇文章主要介紹了Vue 2.0學(xué)習(xí)筆記之Vue中的computed屬性,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
Vue如何實(shí)現(xiàn)pptx在線預(yù)覽
通過PPTXjs插件,實(shí)現(xiàn)PPTX文件在線預(yù)覽,需下載PPTXjs,將其引入HTML頁面,并編寫相應(yīng)的HTML和JS代碼,如果是移動(dòng)端還需調(diào)整div大小,這是一種便捷的前端PPTX轉(zhuǎn)HTML技術(shù),適合網(wǎng)頁展示使用2024-09-09

