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 ...
随机推荐
- jQuery实时显示日期、时间
jQuery实时显示日期.时间 html: <span id="time"></span> js: <script src="Js/jque ...
- 【python基础】复杂数据类型-列表类型(元组)
1.初识元组 列表非常适合用于存储在程序运行期间可能变化的数据集.列表是可以修改的. 然而,有时候需要创建一系列不可修改的元素,元组可以满足这种需求 python将不能修改的值称为不可变的,而不可变的 ...
- .Net全网最简RabbitMQ操作【强烈推荐】
[前言] 本文自1年前的1.0版本推出以来,已被业界大量科技公司采用.同时也得到了.Net圈内多位大佬的关注+推荐,文章也被多家顶级.Net/C#公众号转载. 现在更新到了7.0版本,更好的服务各位. ...
- CKS 考试题整理 (18)-TLS 安全配置
Task 通过 TLS 加强 kube-apiserver 安全配置,要求 kube-apiserver 除了 VersionTLS13 及以上的版本可以使用,其他版本都不允许使用. 密码套件(Cip ...
- JUC同步锁原理源码解析五----Phaser
JUC同步锁原理源码解析五----Phaser Phaser Phaser的来源 A reusable synchronization barrier, similar in functionalit ...
- HiveSQL在使用聚合类函数的时候性能分析和优化详解
概述 前文我们写过简单SQL的性能分析和解读,简单SQL被归类为select-from-where型SQL语句,其主要特点是只有map阶段的数据处理,相当于直接从hive中取数出来,不需要经过行变化. ...
- Linux系统运维之Web服务器Nginx安装
一.介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.本文先整理web服务器内容. 二.环境及软件版本 操作 ...
- SpringBoot基础学习(番外9.1)Spring MVC或Spring Boot配置默认访问页面不生效?
1.tomcat配置默认访问页面 进入 tomcat 的 conf 目录,编辑 web.xml 文件.在 <web-app></web-app> 添加默认访问页面. <w ...
- [solved] login to server failed: EOF
问题 frp 报错:login to server failed: EOF 解决方案 客户端配置 common 下 添加 tls_enable = true [common] tls_enable = ...
- 可视化容器管理工具-portainer.io使用
续docker日常使用指南 背景 当我们开始使用docker后,我们的机器上镜像和容器会越来越多,或者有时候我们有多台开发机的时候,单纯使用命令行去管理镜像和容器就变得麻烦了,这时,我们就可以选择一些 ...