让fetch也可以timeout
原生的HTML5 API fetch并不支持timeout
属性,习惯了jQuery的ajax配置的同学,如果一时在fetch找不到配置timeout
的地方,也许会很纠结。fetch 的配置 API 如下:
语法
fetch(input, init).then(function(response) { ... });
参数
- input
定义要获取的资源。这可能是:
一个 USVString 字符串,包含要获取资源的 URL。
一个 Request 对象。
- init 可选
一个配置项对象,包括所有对请求的设置。可选的参数有:
method: 请求使用的方法,如 GET、POST。
headers: 请求的头信息,形式为 Headers 对象或 ByteString。
body: 请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
mode: 请求的模式,如 cors、 no-cors 或者 same-origin。
credentials: 请求的 credentials,如 omit、same-origin 或者 include。
cache: 请求的 cache 模式: default, no-store, reload, no-cache, force-cache, or only-if-cached.
根本找不到timeout
配置,本文和大家分享如何快速实现 fetch 的 timeout
功能。
我们先实现abort
功能,但由于初始化fetch后,返回的是一个Promise对象,那么需要在abort
后达到触发reject
Promise的效果。
如果要沿用fetch返回的Promise来实现abort
估计是达不到效果的,这里需要借助自己的一个Promise实例来达到目的。
var abort_fn = null;
var abort_promise = new Promise(function(resolve, reject) {
abort_fn = function() {
reject('abort promise');
};
});
这个简单的代码段,可以通过调用abort_fn
函数就可以触发abort_promise的reject
。
fetch 返回的promise 我们暂且称为 fetch_promise 吧,那么现在有两个 promise:abort_promise
和 fetch_promise
。
每个promise都可以绑定resolve callback 和 reject callbck,那么后续then的回调绑定到哪个promise上呢,这是一个问题。
这里我们使用Promise非常好用的Promise.race
方法, 他可以帮我们解决这个问题:
Promise.race 概述
Promise.race(iterable)方法返回一个promise,这个promise在iterable中的任意一个promise被解决或拒绝后,立刻以相同的解决值被解决或以相同的拒绝原因被拒绝。
合体:
function abortablePromise(fetch_promise) {
var abort_fn = null;
//这是一个可以被reject的promise
var abort_promise = new Promise(function(resolve, reject) {
abort_fn = function() {
reject('abort promise');
};
});
//这里使用Promise.race,以最快 resolve 或 reject 的结果来传入后续绑定的回调
var abortable_promise = Promise.race([
fetch_promise,
abort_promise
]);
abortable_promise.abort = abort_fn;
return abortable_promise;
}
经过abortablePromise
包裹后的promise都会返回一个新的promise,不同的是带上了一个abort方法。
使用例子:
var p = abortablePromise(fetch('//a.com/b/c'));
p.then(function(res) {
console.log(res)
}, function(err) {
console.log(err);
});
//假设fetch要3秒,但是你想在2秒就放弃了:
setTimeout(function() {
p.abort(); // -> will print "abort promise"
}, 2000);
目前为止,大体功能已经实现,再稍微调整,让调用更方便:
function _fetch(fetch_promise, timeout) {
var abort_fn = null;
//这是一个可以被reject的promise
var abort_promise = new Promise(function(resolve, reject) {
abort_fn = function() {
reject('abort promise');
};
});
//这里使用Promise.race,以最快 resolve 或 reject 的结果来传入后续绑定的回调
var abortable_promise = Promise.race([
fetch_promise,
abort_promise
]);
setTimeout(function() {
abort_fn();
}, timeout);
return abortable_promise;
}
//usage:
_fetch(fetch('//a.com/b/c'), 2000)
.then(function(res) {
console.log(res)
}, function(err) {
console.log(err);
});
此方法不仅用于fetch,也可以用于
全文完
让fetch也可以timeout的更多相关文章
- 封装fetch的使用(包含超时处理)
// 1: 传统fetch操作 fetch('http://facebook.github.io/react-native/movies.json') .then((response) => r ...
- React Native 网络请求封装:使用Promise封装fetch请求
最近公司使用React作为前端框架,使用了异步请求访问,这里做下总结: React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRe ...
- 【译】XMLHttpRequest和Fetch, 谁最适合AJAX?
原文地址:https://www.sitepoint.com/xmlhttprequest-vs-the-fetch-api-whats-best-for-ajax-in-2019/ 目录 从AJAX ...
- Kafka:主要参数详解(转)
原文地址:http://kafka.apache.org/documentation.html ############################# System ############### ...
- kafka0.9.0及0.10.0配置属性
问题导读1.borker包含哪些属性?2.Producer包含哪些属性?3.Consumer如何配置?borker(0.9.0及0.10.0)配置Kafka日志本身是由多个日志段组成(log segm ...
- Kafka主要参数详解(转)
原文档地址:http://kafka.apache.org/documentation.html ############################# System ############## ...
- 转载:kafka参数详解
原文:http://kafka.apache.org/documentation.html ############################# System ################# ...
- Kafka 设计与原理详解
一.Kafka简介 本文综合了我之前写的kafka相关文章,可作为一个全面了解学习kafka的培训学习资料. 转载请注明出处 : 本文链接 1.1 背景历史 当今社会各种应用系统诸如商业.社交.搜索. ...
- MDN > Web technology for developers > HTTP
The Hypertext Transfer Protocol (HTTP) is an application-layer protocol for transmitting hypermedia ...
随机推荐
- Android菜鸟成长记12 -- ORMLite的简单使用
在我们的开发中,为了提高开发效率,我们一般都会使用到框架,ormilte则是我们必不可少的数据库框架. 对于ORMLite我也是今天才刚刚接触,我们先从一个简单的项目来了解它吧. ORMLite ja ...
- CC1310之使用SMARTRF STUDIO
SMARTRF STUDIO是TI提供的射频测试软件,在调射频的时候非常非常非常好用,推荐每一个使用TI射频芯片的工程师都要掌握. 1 如何使用? 要使用SMARTRF STUDIO,硬件必须连接仿真 ...
- 自定义ViewGroup
ViewGroup --->A ViewGroup is a special view that can contain other views (called children.) The v ...
- Git学习(四)——分支管理
一.创建与合并分支 1.创建分支 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点.每次提交 ,mast ...
- 第四十一章 微服务CICD(3)- jenkins + gitlab + webhooks + publish-over-ssh(1)
一.作用 使用webhooks来实现当git客户端push代码到gitlab后,jenkins会立即去gitlab拉取代码并构建. 二.步骤 1.安装插件 ruby_runtime(Hook插件依赖于 ...
- 关于BaseExpandableListAdapter
首先要明确,可折叠列表在每个项是包含子项的,那么肯定会用到集合嵌套!下面是封装的两个实体类: package com.yx.pojo;public class Chid { privat ...
- UILabel添加图片之富文本的简单应用
若想对UILabel添加图片,那么就需要使用NSMutableAttributedString来定义先定义一个普通的label UILabel *lab = [[UILabel alloc]initW ...
- GUI的搭建,windowbuilder的使用
在进行GUI的搭建过程中,相信很多人对于一个图标的设置感觉写起来很麻烦,需要不断的添加,而在java中有一个windowbuilder窗口可以很好的帮助我们进行GUI的搭建 1.进入eclipse的页 ...
- AspJpeg使用 .
下载ASPJpeg的bll库,引用 一.为图片添加水印//实例化组件ASPJPEGLib.IASPJpeg objJpeg = new ASPJPEGLib.ASPJpeg();//打开源图片文件ob ...
- 第二章 jQuery数组和字符串
章节内容: 1.利用数组在列表中显示名字 (1)利用数组显示名字列表--join()方法 (2)从数组中获取名字并追加到有序列表--each()方法 (3)利用HTML元素创建数组和计算数组长度--g ...