Fetch and its polyfill

Fetch API提供了一个获取资源的接口。

Basic Fetch

提到获取资源大家都会想到 XHR(XMLHttpRequest),以及通过这个接口实现的Ajax。这是传统的获取数据请求资源的方法。XMLHttpRequest并不是一个最完美的API,配置和调用显得有点混乱,加上是基于事件的异步模型,也没有现在的promise,async/await优雅。Fetch的出现就是为了解决这个问题,看一下使用传统XHR和Fetch分别请求数据的写法:

XHR:

var xmlhttp;
if (window.XMLHttpRequest) {
  xmlhttp = new XMLHttpRequest();
} /*else if (window.ActiveXObject) {
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); //IE5-IE6
*/}
xmlhttp.open('Get', url, true);
xmlhttp.responseType = 'json';

//进度xmlhttprequest level2
//xmlhttp.addEventListener("progress", updateProgress, false);

//完成
xmlhttp.addEventListener("load",handleComplete, false);

//失败
xmlhttp.addEventListener("error", handleFailed, false);

xmlhttp.send();

Fetch API:

fetch('/users.json') .then( function (response) { 
  return response.json();
}).then(function (json) {
  console.log('parsed json', json) ;
}).catch(function(ex) { 
  console.log('parsing failed', ex) 
});

Fetch API使用 Javascript Promises 来处理返回值或者是回调。如果你没用使用过promise,就去学咯,因为很快他就会随处可见了。

Fetch Usage

Fetch Header 允许通过执行new Header() 来灵活的设置一个请求头Header

var head = new Headers();

//add new 
head.append('Content-Type', 'text/xml');
head.append('X-My-Custom-Header', 'CustomValue');

//has, get,set,delete,initial
head.get('Content-Type'); // text/xml
head.set('Content-Type', 'text/xml');
.....

你也可以在一个Request实例中使用Header:

var request = new Request(url, {
  headers: new Headers({
    'Content-Type': 'text/xml'
  })
});
fetch(request).then(function() {
  // handle response
});

Fetch Request可以通过Fetch Request来发送一个请求Request

var request = new Request(url, {
  method: 'post',
  mode: 'cors',
  redirect: 'follow',
  headers: new Headers({
    'Content-Type': 'text-plain'
  })
});
fetch(request).then(function() {
  //handle response
})

Fetch Response Fetch 的 then 方法提供了一个 response实例,你可以手动创建一个Response,但是更多情况下是作为另一个API调用的返回结果。比如 Service Worker 的 Fetchevent.responseWith 或者是简单的Fetch API调用。 Response:

var response = new Response('....', {
  ok: false,
  status: 404,
  url: '/'
});

fetch('/')
  .then(funcyion(responseObject) {
    console.log('status: ', responseObject.status);
  }); 

fetch支持所有的 HTTP 方法,可以处理JSON,HTML,二进制返回值,比如:

处理JSON

fetch('/user.json')
  .then(function(response) {
    return response.json();
  }).then(function(json) {
    console.log('parsed json', json);
  }).catch(function(ex) {
    console.log('parsing failed', ex);
  });

发送表单

fetch('/submit-json', {
  method: 'post', 
  body: JSON.stringify({ 
    email: document.getElementById('email').value,
    answer: document.getElementById('answer').value
  })
});

注意
1.Fetch请求默认不带cookie,但是这可以通过 fetch(url, {credentials: 'same-origin'})设置同域,fetch(url, {credentials: 'include'})设置跨域。
2.服务器返回错误码的时候并不会reject,只有发生网络错误,或者是请求拦截的时候会reject。

fetch是一个优雅的资源获取方案。也是一个正在研究中的方案,目前的原生支持率并不高,使用起来很麻烦,幸运的是目前开源了许多的polyfill,引入之后IE9以上都可以完美支持。比如:github/fetch,除此之外还有 fetch-jsonp, fetch-ie8等polyfill,引入之后基本可以在IE8以上的生产环境使用。

扩展阅读

  1. MDN Fetch API
  2. github/fetch
  3. MDN es6-promise
  4. whatwg fetch
  5. deep fetch
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 本文详细介绍了 XMLHttpRequest 相关知识,涉及内容: AJAX、XMLHTTP、XMLHttpReq...
    semlinker阅读 13,594评论 2 18
  • Asynchronous JavaScript and XML(异步的 JavaScript 和 XML) XHR...
    KeKeMars阅读 2,854评论 1 2
  • 原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被...
    9a9Hbx阅读 14,935评论 17 161
  • 我是一个常常会在社交软件中失踪的人,每年总会有一段时间我不刷空间、不看朋友圈、不发微博,从所有社交圈中销声匿迹。在...
    3分天下阅读 973评论 0 2