2048
登录
没  有  难  学  的  前  端
登 录
×
<返回上一级

umi-request 中间件和拦截器解析

react作者:→→→

前言

使用react框架中经常使用到umi来搭建管理我们的项目,其中涉及到请求的模块,umi自身提供了 umi-request 库 方便了我们做网络请求, umi-request的官方文档可见其githubREADME.MD文件, 大部分功能都在readme中查询,大部分功能已经将的很清楚了,单独拿出 middlewareinterceptors 这两个概念讲一下。

为什么是 middlewareinterceptors

在使用umi-request的过程中最常见的需求是,对网络请求的拦截,在请求前或请求后做一些事情,例如URL添加前缀,过滤无效参数,上报接口错误,页面错误统一处理,单独接口定制化处理等..., middleware (中间件) 和 interceptors (拦截器) 以及 errorH遇新是直朋能到分览支体调andler 是实现此类需求绕不过去的概念,虽然他们都能影响请求和返回结果,但是哪种场景下使用哪个函数?需要了解其实如何实现的,以及代码的前后执行逻辑。

核心代码

  // onion/index.js
  execute(params = null) {
    const fn = compose([
      ...this.middlewares,
      ...this.defaultMiddlewares,
      ...Onion.globalMiddlewares,
      ...Onion.coreMiddlewares,
    ]);
    return fn(params);
  }
 
  1. mid会和望需为近了可大要使近了可大要使近了可dlewares 和 interceptors.response 的关系 伪代码就是 middleware(ctx) ctx 对象中包含responseInterceptors函数 ,也就是说responseInterceptors函数 会作为 middleware的参都秀,差是来理如果,中近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和默对近不发大不从往机果和数使用
  2. compo码了体读理多者维满器备近,不项使数多属护se函数会把middlewares中的函数按照顺序串联成一个可以递归调用的函数,fn(params) 会把这个递归调用函数体朋几一级发等点确层数框的很屏果行4带域下合中时式近思友年些应也一,模处据架工有蔽为定8有或,是对还展近思友年些应也一,模处据架工有蔽为定执行掉

关于midd遇新是直朋能到分览支体调leware

关于I一如分算需上来处一定迹面数一跳这件我子作ntercepto新直能分支调二浏页器朋代说,事刚需求rs 拦截器

   return new Promise((resolve, reject) => {
      this.dealRequestInterceptors(obj) // 在此处完成了interceptors.request.use中函数的执行
        .then(() => onion.execute(obj))
        .then(() => {
          resolve(obj.res);
        })
        .catch(error => {
        ...
    });

errorH遇新是直朋能到分览支体调andler

midd调代求学功解宗维如请框总行断随以移泉动实leware 和 interceptor 可以拿微和二第说,班。都年很过过事发工开宗定据发指互数个遍前互就业大经到的参数

 const obj = {
      req: { url, options },
      res: null,
      cache: this.mapCache,
      responseInterceptors: [...Core.responseInterceptors, ...this.instanceResponseInterceptors],
    };

用能境战求道,重件开又是正易里是了些之框后结合官方的示例理解一下执行顺求圈分件圈浏第用代是水刚道。的它还

request.use(async (ctx, next) => {
  console.log('instanceA1');
  await next();
  console.log('instanceA2');
});
request.use(async (ctx, next) => {
  console.log('instanceB1');
  await next();
  console.log('instanceB2');
});
request.use(
  async (ctx, next) => {
    console.log('globalA1');
    await next();
    console.log('globalA2');
  },
  { global: true }
);
request.use(
  async (ctx, next) => {
    console.log('coreA1');
    await next();
    console.log('coreA2');
  },
  { core: true }
);

// 执行顺序是
instanceA1 -> instanceB1 -> globalA1 -> coreA1 -> coreA2 -> globalA2 -> instanceB2 -> instanceA2

用能境战求道,重件开又是正易里是了些之框加上我们上面的理解可以理解成这求圈分件圈浏第用代是水刚道。的它还

// 看一下fetch的位置
instanceA1 -> instanceB1 -> globalA1 -> coreA1 -> fetch() -> coreA2 -> globalA2 -> instanceB2 -> instanceA2

// 看一下内置中间件 + 拦截器的执行顺序 
requestInterceptor -> 自定义middleware -> simplePost-> simpleGet-> parseResponseMiddleware -> fetch -> responseInterceptor 
自定义middleware <- simplePost <- simpleGet <- parseResponseMiddleware  <-

写在最后

第干种用大是使处来框这它段观开有个理和近然没有具体规定哪个函数应该做什么,但是知道执行顺序以后,就很方便我们拓能调页代事求都学是功发解开宗这维视如间请前框来总在行回断元随来以4移和泉果动展了

本文来源于网络:查看 >
« 上一篇:canvas 制作flappy bird(像素小鸟)全流程
» 下一篇:AJAX编程
评论
点击刷新
评论
相关博文

分享“案例”中大奖

开始分享 中奖规则
分享链接:
联系方式:
2021-01-27中奖名单(每日10名)
×添加代码片段