预期效果:多个请求并发时,所有请求完成后才关闭loading。
解决方案:增加一个 loadingCount 变量,用来计算请求的次数。
import Vue from 'vue'
import axios from 'axios'
const Loading = Vue.prototype.$loading;
const Message = Vue.prototype.$message;var loadingCount = 0;
var loadingService = nullfunction addLoading() {if (!loadingService) {loadingService = Loading?.({fullscreen: true,background: 'transparent',});}loadingCount++
}function isCloseLoading() {loadingCount--if (loadingCount == 0) {loadingService?.close();}
}axios.interceptors.request.use(config => {addLoading()return config
}, error => {loadingService?.close();loadingCount = 0Message.error('网络异常,请稍后再试')return Promise.reject(error)
})// 添加响应拦截器
axios.interceptors.response.use(response => {isCloseLoading()return response
}, error => {loadingService?.close();loadingCount = 0Message.error('网络异常,请稍后再试')return Promise.reject(error)
})
这个拦截器的功能是:
-
每当发起一个请求,打开 loading,同时 loadingCount 加 1;
-
每当一个请求结束, loadingCount 减 1,并判断 loadingCount 是否为 0,如果为 0,则关闭 loading;
这样即可解决多个请求下有某个请求提前结束,导致 loading 关闭的问题。