@prequest/timeout

超时中间件。对于不支持设置超时时间的请求内核,你可以安装超时中间件来获得超时响应失败的能力。

Usage no npm install needed!

<script type="module">
  import prequestTimeout from 'https://cdn.skypack.dev/@prequest/timeout';
</script>

README

@prequest/timeout

超时中间件。对于不支持设置超时时间的请求内核,你可以安装超时中间件来获得超时响应失败的能力。

对于一些本不支持设置超时时间的请求内核以及 Fetch 来说,没有办法真正的在超时之后,取消请求。只能使用超时抛异常的方式来满足需求。

安装

npm install @prequest/timeout

使用

类型注入

类型注入需要创建实例,通过类型注入,可以在写代码时,获得智能提示。

import { create, Request, Response } from '@prequest/xhr'
import timeoutMiddleware, { TimeoutInject } from '@prequest/timeout'

const prequest = create<TimeoutInject>()

统一控制

import { prequest, Request, Response } from '@prequest/xhr'
import timeoutMiddleware from '@prequest/timeout'

const middleware = timeoutMiddleware<Request, Response>({
  timeout: 5000,
  timeoutControl: () => {
    // 开发环境设置超时时间
    return process.NODE_ENV === 'development'
  },
})

prequest.use(middleware)

单一控制

prequest('/api', {
  timeout: 1000,
})

配置项

Option Name Type Default Required Meaning
timeout number 0 false 超时时间
timeoutControl (opt: Request) => boolean null false 超时控制

一般来讲,不会用到 timeoutControl 这个方法,但对于一些跨平台应用来说,打包成不同的平台,可能会使用不同的请求内核,而这些内核对于 timeout 支持度是不一样的,因而希望,如果请求内核支持 timeout,那么 timeout 由内核进行处理,否则由中间件处理。

下面以 uni-app 为例:

查看 uni.request 文档,发现微信小程序与支付宝小程序支持 timeout,其他环境不支持,因而可以写如下控制条件

// 获取编译的平台信息
const platform = process.env.UNI_PLATFORM

const middleware = timeoutMiddleware({
  timeout: 5000,
  timeoutControl(opt) {
    // 微信小程序、支付宝小程序 timeout 由请求内核进行处理
    if (['mp-alipay', 'mp-weixin'].includes(platform)) return false

    // 其余由中间件处理
    return true
  },
})