promise + fetch + AbortController + setTimeOut

这是一段正常的fetch请求

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

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

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

尝试一下使用setTimeOut

在n个时间后执行

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

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

什么是AbortController

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

// 构建一个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.

// 公用的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)
})

Fetch设置超时请求的更多相关文章

  1. GuzzleHttp 请求设置超时时间

    之前调用一个三方的 WEB API,大量的请求超时,导致 PHP 进程被占用完.整个网站一直报 504. 其中一个优化措施就是对三方 API 调用设置超时时间. use GuzzleHttp\Clie ...

  2. 【转载】Extjs设置Ajax请求的超时时间timeout

    在Extjs中的Ajax请求中,Ext.Ajax.request 默认超时时间是30秒,有时候我们有比较耗时的操作需要设置更长时间,此时我们就需要修改Ext.Ajax.Requset的超时时间为更长, ...

  3. 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置

    场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...

  4. [转]axios请求超时,设置重新请求的完美解决方法

    自从使用Vue2之后,就使用官方推荐的axios的插件来调用API,在使用过程中,如果服务器或者网络不稳定掉包了, 你们该如何处理呢? 下面我给你们分享一下我的经历. 具体原因 最近公司在做一个项目, ...

  5. fetch添加超时时间

    fetch添加超时时间 其实为fetch添加超时时间很简单,需要用到Promise.race()方法. Promise.race() 方法将多个Promise包装成一个新的Promise实例. var ...

  6. php使用curl设置超时的重要性

    原文:http://phpquan.com/lamp/php/php-curl-timeout/ 网站登录不了,原因是没有可用的 PHP 子进程来响应新的请求了.这可能是是由于PHP-curl  没有 ...

  7. Resttemplate中设置超时时长方法

    为了满足调用需求,需要在使用Resttemplate发送请求时,修改超时时长,网上给出了相关修改方法,代码如下: HttpComponentsClientHttpRequestFactory rf = ...

  8. HttpClient库设置超时

    HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpCli ...

  9. httpClient创建对象、设置超时

    从老版本和新版本进行比较说明: 1.创建HttpClient对象 3.X: HttpClient httpClient = new DefaultHttpClient(); 4.3: Closeabl ...

  10. HttpClient设置超时(转)

    HttpClient  4.5版本设置连接超时时间-CloseableHttpClient设置Timeout(区别于4.3.2) HttpClient升级到4.5版本后,API有很多变化,HttpCl ...

随机推荐

  1. 小程序提交POST请求,出现405错误

    status": 405, "error": "Method Not Allowed", "message": "Req ...

  2. 从源码分析 Go 语言使用 cgo 导致的线程增长

    TDengine Go 连接器 https://github.com/taosdata/driver-go 使用 cgo 调用 taos.so 中的 API,使用过程中发现线程数不断增长,本文从一个 ...

  3. ISIS 综合实验;BGP 实验

    目录 ISIS 综合实验 实验拓扑 实验需求 实验步骤 1.配置相应接口IP地址及环回口地址 2.配置 IS-IS,要求全网互通,R8的Loop X口暂不宣告 3. R1和R3直连,要求 R3 成为 ...

  4. .Net8罕见的技术:MSIL的机器码简析

    前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机 ...

  5. 一篇讲懂Java运行类型、编译类型和多态(面向对象语言精髓之一)

    对象:运行类型.编译类型和多态 1.搞清楚面向对象的运行类型和编译类型就掌握了对象的精髓,我们用举个例子 class Father { Father() { System.out.println(&q ...

  6. React后台管理系统07 首页布局

    注释掉App.tsx中的几个路由组件: 将Home.tsx中的代码使用ant Design网站中的布局进行替换 复制的代码如下: import { DesktopOutlined, FileOutli ...

  7. 开发中MongoDB遇到的各种问题

    目录 一.安装6版本以下 二.安装6版本及以上 三.安装6版本以下(解压版) 四.配置本地 Windows MongoGB 服务 五.navicat 连接远程mongodb数据库 六.ip不一致问题 ...

  8. Unparseable date: "2019-03-27"

    Unparseable date: "2 public static void main(String[] args) { try { String dateStr="2019-0 ...

  9. php处理emoji表情 存数据库

    PHP 处理emoji表情 存数据库 直接过滤掉 1 function filter_emoji($str) { 2 $regex = '/(\\\u[ed][0-9a-f]{3})/i'; 3 $s ...

  10. sql-lab通关

    page1-less1-22 联合查询 第一关 发现是有回显的,且传入的参数是通过'1'包裹的,所以我们的payload,如下 测试列数 ?id=1' order by 3 --+ //超过第一条语句 ...