Fetch-新一代Ajax API

AJAX半遮半掩的底層API是飽受詬病的一件事情.  XMLHttpRequest 並非專爲Ajax而設計的. 雖然各類框架對  XHR 的封裝已經足夠好用, 但咱們能夠作得更好。
window.fetch 方法, 在最新版的 Firefox 和 Chrome 中已經提供支持。
1.語法簡潔,更加語義化

2.基於標準 Promise 實現,支持 async/awaitgit

3.同構方便,使用 isomorphic-fetchgithub

// url (必須), options (可選)
fetch('/some/url', {
    method: 'get'
}).then(function(response) {

}).catch(function(err) {
    //中途任何地方出錯...在此處理
 :(
});

//使用 ES6 的 箭頭函數 後:
fetch(url).then(response => response.json())
  .then(data => console.log(data))
  .catch(e => console.log("Oops, error", e))

fetch API 也使用了 JavaScript Promises 來處理結果/回調。自定義請求頭信息極大地加強了請求的靈活性。咱們能夠經過  new Headers() 來建立請求頭
// 建立一個空的 Headers 對象,注意是Headers,不是Header
var headers = new Headers();

// 添加(append)請求頭信息
headers.append('Content-Type', 'text/plain');
headers.append('X-My-Custom-Header', 'CustomValue');

// 判斷(has), 獲取(get), 以及修改(set)請求頭的值
headers.has('Content-Type'); // true
headers.get('Content-Type'); // "text/plain"
headers.set('Content-Type', 'application/json');

// 刪除某條請求頭信息(a header)
headers.delete('X-My-Custom-Header');

// 建立對象時設置初始化信息
var headers = new Headers({
    'Content-Type': 'text/plain',
    'X-My-Custom-Header': 'CustomValue'
})

Request 對象表示一次 fetch 調用的請求信息。傳入 Request 參數來調用 fetch, 能夠執行不少自定義請求的高級用法:ajax

  • method - 支持 GETPOSTPUTDELETEHEAD
  • url - 請求的 URL
  • headers - 對應的 Headers 對象
  • referrer - 請求的 referrer 信息
  • mode - 能夠設置 corsno-corssame-origin
  • credentials - 設置 cookies 是否隨請求一塊兒發送。能夠設置: omitsame-origin
  • redirect - followerrormanual
  • integrity - subresource 完整性值(integrity value)
  • cache - 設置 cache 模式 (defaultreloadno-cache)

Request 的示例以下:json

var request = new Request('/users.json', {
    method: 'POST', 
    mode: 'cors', 
    redirect: 'follow',
    headers: new Headers({
        'Content-Type': 'text/plain'
    })
});

// 使用!
fetch(request).then(function() { /* handle response */ });

只有第一個參數 URL 是必需的。在 Request 對象建立完成以後, 全部的屬性都變爲只讀屬性. 請注意, Request有一個很重要的 clone 方法, 特別是在 Service Worker API 中使用時 —— 一個 Request 就表明一串流(stream), 若是想要傳遞給另外一個 fetch 方法,則須要進行克隆。由於 Request 和 fetch 的簽名一致, 因此在 Service Workers 中, 你可能會更喜歡使用 Request 對象。segmentfault

Response 表明響應, fetch 的 then 方法接收一個 Response 實例, 固然你也能夠手動建立 Response 對象api

能夠配置的參數包括:promise

  • type - 類型,支持: basiccors
  • url
  • useFinalURL - Boolean 值, 表明 url 是不是最終 URL
  • status - 狀態碼 (例如: 200404, 等等)
  • ok - Boolean值,表明成功響應(status 值在 200-299 之間)
  • statusText - 狀態值(例如: OK)
  • headers - 與響應相關聯的 Headers 對象

Response 提供的方法以下:瀏覽器

  • clone() - 建立一個新的 Response 克隆對象.
  • error() - 返回一個新的,與網絡錯誤相關的 Response 對象.
  • redirect() - 重定向,使用新的 URL 建立新的 response 對象..
  • arrayBuffer() - Returns a promise that resolves with an ArrayBuffer.
  • blob() - 返回一個 promise, resolves 是一個 Blob.
  • formData() - 返回一個 promise, resolves 是一個 FormData 對象.
  • json() - 返回一個 promise, resolves 是一個 JSON 對象.
  • text() - 返回一個 promise, resolves 是一個 USVString (text).

1.JSON格式cookie

fetch('http://jartto.wang/test.json')
.then(function(response) {
// Convert to JSON
return response.json();
})
.then(function(result) {
console.log(result);
});

2.返回HTML/text網絡

fetch('/next/page')
.then(function(response) {
return response.text();
}).then(function(text) {
// <!DOCTYPE ....
console.log(text);
});

3.發送form表單數據

//form data
var form = document.querySelector('form');
fetch('http://jartto.wang/submit', {
method: 'post',
body: new FormData(form)
});
//JSON
fetch('http://jartto.wang/submit-json', {
method: 'post',
body: JSON.stringify({
name: 'jartto',
blog: 'http://jartto.wang'
})
});

4.圖片的處理

fetch('http://jartto.wang/logo.png')
.then(function(response) {
return response.blob();
})
.then(function(imageBlob) {
document.querySelector('img').src = URL.createObjectURL(imageBlob);
});

缺點

1.不能夠取消:Ajax調用XMLHttpRequest對象上的abort方法,可是Fetch好像沒啥辦法。

2.瀏覽器支持:瀏覽器支持不是很好,可是咱們能夠用window.fetch polyfill來處理兼容問題。瀏覽器支持狀況大體以下:

- Chrome 
- Firefox
- Safari 6.1+
- Internet Explorer 10+
 最近把阿里一個千萬級 PV 的數據產品所有由 jQuery 的  $.ajax 遷移到  Fetch,上線一個多月以來運行很是穩定。結果證實,對於 IE8+ 以上瀏覽器,在生產環境使用 Fetch 是可行的。

 

參考:
相關文章
相關標籤/搜索