Fetch设置超时请求
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设置超时请求的更多相关文章
- GuzzleHttp 请求设置超时时间
之前调用一个三方的 WEB API,大量的请求超时,导致 PHP 进程被占用完.整个网站一直报 504. 其中一个优化措施就是对三方 API 调用设置超时时间. use GuzzleHttp\Clie ...
- 【转载】Extjs设置Ajax请求的超时时间timeout
在Extjs中的Ajax请求中,Ext.Ajax.request 默认超时时间是30秒,有时候我们有比较耗时的操作需要设置更长时间,此时我们就需要修改Ext.Ajax.Requset的超时时间为更长, ...
- 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置
场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...
- [转]axios请求超时,设置重新请求的完美解决方法
自从使用Vue2之后,就使用官方推荐的axios的插件来调用API,在使用过程中,如果服务器或者网络不稳定掉包了, 你们该如何处理呢? 下面我给你们分享一下我的经历. 具体原因 最近公司在做一个项目, ...
- fetch添加超时时间
fetch添加超时时间 其实为fetch添加超时时间很简单,需要用到Promise.race()方法. Promise.race() 方法将多个Promise包装成一个新的Promise实例. var ...
- php使用curl设置超时的重要性
原文:http://phpquan.com/lamp/php/php-curl-timeout/ 网站登录不了,原因是没有可用的 PHP 子进程来响应新的请求了.这可能是是由于PHP-curl 没有 ...
- Resttemplate中设置超时时长方法
为了满足调用需求,需要在使用Resttemplate发送请求时,修改超时时长,网上给出了相关修改方法,代码如下: HttpComponentsClientHttpRequestFactory rf = ...
- HttpClient库设置超时
HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpCli ...
- httpClient创建对象、设置超时
从老版本和新版本进行比较说明: 1.创建HttpClient对象 3.X: HttpClient httpClient = new DefaultHttpClient(); 4.3: Closeabl ...
- HttpClient设置超时(转)
HttpClient 4.5版本设置连接超时时间-CloseableHttpClient设置Timeout(区别于4.3.2) HttpClient升级到4.5版本后,API有很多变化,HttpCl ...
随机推荐
- 小程序提交POST请求,出现405错误
status": 405, "error": "Method Not Allowed", "message": "Req ...
- 从源码分析 Go 语言使用 cgo 导致的线程增长
TDengine Go 连接器 https://github.com/taosdata/driver-go 使用 cgo 调用 taos.so 中的 API,使用过程中发现线程数不断增长,本文从一个 ...
- ISIS 综合实验;BGP 实验
目录 ISIS 综合实验 实验拓扑 实验需求 实验步骤 1.配置相应接口IP地址及环回口地址 2.配置 IS-IS,要求全网互通,R8的Loop X口暂不宣告 3. R1和R3直连,要求 R3 成为 ...
- .Net8罕见的技术:MSIL的机器码简析
前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机 ...
- 一篇讲懂Java运行类型、编译类型和多态(面向对象语言精髓之一)
对象:运行类型.编译类型和多态 1.搞清楚面向对象的运行类型和编译类型就掌握了对象的精髓,我们用举个例子 class Father { Father() { System.out.println(&q ...
- React后台管理系统07 首页布局
注释掉App.tsx中的几个路由组件: 将Home.tsx中的代码使用ant Design网站中的布局进行替换 复制的代码如下: import { DesktopOutlined, FileOutli ...
- 开发中MongoDB遇到的各种问题
目录 一.安装6版本以下 二.安装6版本及以上 三.安装6版本以下(解压版) 四.配置本地 Windows MongoGB 服务 五.navicat 连接远程mongodb数据库 六.ip不一致问题 ...
- Unparseable date: "2019-03-27"
Unparseable date: "2 public static void main(String[] args) { try { String dateStr="2019-0 ...
- php处理emoji表情 存数据库
PHP 处理emoji表情 存数据库 直接过滤掉 1 function filter_emoji($str) { 2 $regex = '/(\\\u[ed][0-9a-f]{3})/i'; 3 $s ...
- sql-lab通关
page1-less1-22 联合查询 第一关 发现是有回显的,且传入的参数是通过'1'包裹的,所以我们的payload,如下 测试列数 ?id=1' order by 3 --+ //超过第一条语句 ...