切換路由頁面時,停止上個路由頁面未返回數據的請求vue
一般狀況下,接口返回數據很快,但萬事無絕對
若接口返回數據較慢此時用戶快速切換菜單,那麼上個路由的請求還處在發送中,爲了處理效率,對請求作些處理ios
vue 項目使用 axios 封裝請求,此處要用到 axios 中的 CancelToken
在封裝好的請求文件(request.js)中,加入如下內容axios
/** ...省略的代碼 */ const clearRequest = { source: { token: null, cancel: null } } const cancelToken = axios.CancelToken const source = cancelToken.source() // 建立 axios 實例 const service = axios.create({ cancelToken: source.token, baseURL: process.env.BASE_API, timeout: 6000 // 請求超時時間 }) // request 攔截器 service.interceptors.request.use( config => { /** ...省略的代碼 */ config.cancelToken = clearRequest.source.token return config }, error => { /** ...省略的代碼 */ Promise.reject(error) } ) /** ...省略的代碼 */ export {clearRequest}
修改路由配置,每次路由變化前執行 cancel 方法,並更新 cancelTokencode
import {clearRequest} from '@/utils/request' import axios from 'axios' /** ...省略的代碼 */ router.beforeEach((to, from, next) => { /** ...省略的代碼 */ // 切換路由時清空上個路由未完成的全部請求 const cancelToken = axios.CancelToken clearRequest.source.cancel && clearRequest.source.cancel() clearRequest.source = cancelToken.source() /** ...省略的代碼 */ }