const install = (Vue, vm) => { // 是否正在刷新的标记 let isRefreshing = false // 重试队列,每一项将是一个待执行的函数形式 let requests = [] // 请求拦截器 uni.$u.http.interceptors.request.use((config) => { uni.showLoading({ title: '加载中', mask: true }); const cookies = vm.$store.state.cookies || '' if (cookies) { config.header['doumee-auth-token'] = cookies; } return config }, config => { return Promise.reject(config) }) // 响应拦截器 uni.$u.http.interceptors.response.use((response) => { uni.hideLoading(); // 登录过期 if (response.data.code === 401 && vm.$store.state.cookies) { if (!isRefreshing) { // 是否已经执行刷新 isRefreshing = true uni.login({ provider: 'weixin', success: async function (loginRes) { let { code } = loginRes; uni.request({ url: vm.$baseUrl + 'system/loginByWxMini', method: "POST", data: { code }, success: (res) => { isRefreshing = false if (res.data.data) { vm.$store.commit('setCookies', res.data.data) vm.$u.api.getUserInfo() .then(user => { vm.$store.commit('setUserInfo', user.data) }) // 已经刷新了token,将所有队列中的请求进行重试 requests.forEach(item => item(res.data.data)) requests = [] } else { uni.navigateTo({ url: '/pages/login/login' }) } } }); } }); } return new Promise((resolve) => { // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行 requests.push(token => { response.config.header['doumee-auth-token'] = token resolve(uni.$u.http.request(response.config)); }) }) } else if (response.data.code === 401 && !vm.$store.state.cookies) { uni.navigateTo({ url: '/pages/login/login' }) } if (response.data.code !== 200) { uni.showToast({ title: response.data.message, icon: "none", duration: 2000 }); } return response.data; }, (response) => { uni.hideLoading(); return Promise.reject(response) }) } export default { install }