Fetch设置超时请求

promise + fetch + AbortController + setTimeOut

这是一段正常的fetch请求

js 复制代码
fetch('www.baidu.com',{})
  .then(res=>res.json())
  .then(console.log(res) // 打印返回结果
  .catch(...) // 捕获错误信息

这段代码实现: 返回成功打印, 返回失败捕获, 无限制超时时间.

假设限制超时间为3000ms, 需要怎么写呢?

尝试一下使用setTimeOut

在n个时间后执行

js 复制代码
let timeoutPromise = (timeout) => {  // 模拟返回一个promise(超时版本)
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(new Response("timeout", { status: 504, statusText: "timeout " }));
        }, timeout);
    });
}

这段代码的执行, 我们可以收到一个n时间后的超时返回.

什么是AbortController

AbortController 接口表示一个控制器对象,允许你根据需要中止一个或多个 Web 请求。

js 复制代码
// 构建一个AbortController
const AC = new AbortController();
const signal = AC.signal; // signal注入请求(例如fetch, 可以终止请求抛出error)

fetch('www.baidu.com',{signal: signal})
  .then(res=>res.json())
  .then(res=>{
    console.log(res);
  })
  .catch(err=>{
    console.log("出错了!", err);
  })
// 例如用一个按钮来终止, 把网络速度调整为slow 3G
abortBtn.addEventListener("click", () => {
  if (controller) {
    AC.abort();
    console.log("中止下载");
  }
});
// 也可以用setTimeOut
setTimeOut(()=>{
  AC.abort();
  alert('终止请求');
}, 100)

实现请求的超时设置

两个请求相互竞争, 谁先完成谁先返回, 真的请求和假(模拟)的请求, 模拟一个八秒就立刻返回的请求, 真的请求如果不能在八秒内请求成功, 那么假的就会立刻返回. 可以想到使用Promise.race方法. 请求成功立刻终止另一个请求AbortController.

js 复制代码
// 公用的AbortController
const AC = new AbortController();
const signal = AC.signal;

// 我们要在100ms内请求百度网址成功
function getBaidu() {
  // 浅浅将signal注入其中
  return fetch('https://www.baidu.com', {signal});
}

// 做一个定时resolve的promise用于和真请求竞争
const timeOutPromise = new Promise((resolve, reject)=>{
  setTimeout(()=>{
    resolve({ status: 504, statusText: "timeout " });
    AC.abort(); // 百度不给我们响应, 我们就终止请求
  }, 100)  // 100ms内百度不resolve我们先resolve
})

// 开始请求(竞争)
Promise.race([timeOutPromise, getBaidu()])
  .then(res=>{
    console.log(res)
  })
  .cathch(err=>{
    console.log(err)
  })
相关推荐
To_OC6 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
小林ixn8 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js
窝子面10 小时前
手搓最简前后端协作-node
javascript·数据库
kyriewen11 小时前
我让AI给前端项目做了一次完整的Code Review——它和人类的差距,比我想的大得多
前端·javascript·ai编程
এ慕ོ冬℘゜11 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
sugar__salt13 小时前
Vue3 表单双向绑定与响应式核心 API 技术详解
前端·javascript·vue.js
SmartBoyW13 小时前
CSS弹性布局(Flexbox)学习笔记:从零开始搞懂弹性布局
前端·javascript
用户9385156350713 小时前
写了这么久 useState,你真的知道它在干什么吗?
前端·javascript
烬羽14 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
浮江雾15 小时前
Flutter第十七节-----路由管理(3)
android·开发语言·前端·javascript·flutter·入门