javascript - axios拦截器错误处理中的承诺堆栈
问题描述
我的 vue 项目中有一个 axios 拦截器错误处理系统,根据错误,可以有一个操作,然后重试失败的请求。
axios.interceptors.response.use(
response => {
return response
},
error => {
if (!error.config.ignoreErrorHandling) {
return handleErrors(error)
}
return Promise.reject(error)
}
)
export const handleErrors = async (error) => {
// ...
const errorHandlers = {
// ...
403: async data => {
const { data } = axios.get(...)
return new Promise((resolve, reject) => {
Dialog.create({
// ...
})
.onOk(async () => {
// Here we retry the request that first failed, and now should not fail
axios(error.config)
.then(resolve)
.catch(reject)
})
.onCancel(() => {
reject(error)
})
})
}
}
}
const { status, data } = error.response
return (
(errorHandlers[status] && (await errorHandlers[status](data))) ||
Promise.reject(error)
)
}
它工作得很好,数据是在第一次请求的地方接收的,没有任何错误(如果代码是 403 并且用户接受了对话框),除非我有多个并行请求,导致多个错误,因此多个对话框。
防止显示多个对话框很容易,但我似乎无法找到一种仅在第一次显示对话框的方法,等待第一个对话框按确定,然后重试其他失败的请求。我的第一种方法是有一个 Promise 堆栈,但没有像我预期的那样工作,因为 Promise 是在 init 上解决的。
解决方案
推荐阅读
- ros - 我可以在实际实践中使用 dji-sdk/Onboard-SDK-ROS 的演示示例吗?
- delphi - 在中间添加新值时如何增加连续的常量值
- inheritance - 覆盖 Odoo10 中的字段的问题(继承)
- c++ - 将存储类声明为主机类中的静态成员
- java - Android Studio Google Vision 条码扫描片段Buttomviewer
- xml - 解析 Xml 文件并映射到 SharePoint 列表中的列
- java - JPA - Sql Server 错误:无法打开登录请求的数据库“Taijitan”
- java - 使用 Jackson 反序列化时禁用标量到字符串的转换
- javascript - 如何让 Moment.js 忽略用户的时区?
- ansible - ansible根据属性合并两个列表