背景
使用依赖:axios、redux、redux-saga
描述:有那么一些axios请求,当返回失败时,如果返回特定错误码这里是状态400,错误码字段为00001时,需要调起验证组件,验证成功后,需要获取其token,重新发起该请求
思考
因为用了redux-saga,该axios请求也是effect里发起的,最开始打算在组件验证成功后,重新调effect;但effect有入参,这种情况下,就要保留上一次的effect的入参,整体变得麻烦起来,后来考虑axios返回中,可以获取该http请求的各项参数,并且axios有方法可以直接接受这些参数并发起相同的请求,省去了数据组装的过程
另外,第二次axios请求触发考虑promise,因为promise要状态改变时才会执行其回调;同时promise可以传递所需的token
伪代码
axios.js
import store from '/store'; // redux的store
instance.interceptors.response.use(
(response) => {
...
},
// 由于返回是400,所以在error中处理
(error) => {
const { response } = error;
const { status , data:code, config} = response;
if(code === 00001){
const { headers, ...rest } = config; // 获取之前的headers
store.dispatch(showComp()); // 执行effect,控制组件显示
let captchaResolve;
let captchaReject;
new Promise((resolve, reject) => {
store.dispatch(setPromise(resolve)); // 将该promise放到redux里去,redux就可以执行它了
}).then((token) => {
captchaResolve(token); // 改变下一个promise的状态
}) .catch((err) => {
captchaReject(err);
});;
// 注意下面的return
return new Promise((resolve) => {
captchaResolve = resolve; // 将该promise的resolve外抛,这样外部可执行
}).then((token) => {
// 获取token,重新发起请求
return instance.request({
...rest,
headers: { ...headers, [Headers.VERIFICATION_TOKEN]: token },
});
}).catch(() => {
...
});
}
effects.js
function verify(params){
...
// 验证成功了
const { token } = response;
axiosPromise && axiosPromise(token); // axiosPromise 就是 setPromise 传入的promise
}