如何中断一个请求后又恢复

692 阅读1分钟

背景

使用依赖: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
}

丑图

image.png