一個隱藏最深的祕密就是AJAX的實現底層的XMLHttpRequest
,這個方法原本並非造出來幹這事的。如今有不少優雅的API包裝XHR,可是這遠遠不夠。因而有了fetch
API。咱們來看看這個API的基本用法。最新的瀏覽器都已經支持這個方法了。javascript
XHR對於我來講太過複雜,用起來大概是這樣的:html
// 開始XHR這些 if (window.XMLHttpRequest) { // Mozilla, Safari, ... request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE try { request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { request = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } } // 發送請求. request.open('GET', 'https://davidwalsh.name/ajax-endpoint', true); request.send(null);
固然咱們的JavaScript框架可讓咱們願意去用XHR,可是你看到的只是一個簡單的例子。java
fetch
方法能夠在window
做用域中找到。第一個參數是你要訪問的URL:git
fetch('https://davidwalsh.name/some/url', { method: 'get' }).then(function(response) { }).catch(function(err) { // Error :( });
fetch
會返回一個Promise做爲結果:github
// 簡單的返回結果處理 fetch('https://davidwalsh.name/some/url').then(function(response) { }).catch(function(err) { // Error :( }); // 更高級的鏈式處理 fetch('https://davidwalsh.name/some/url').then(function(response) { return //... }).then(function(returnedValue) { // ... }).catch(function(err) { // Error :( });
請求能不能靈活使用就在因而否能靈活的設置請求的頭。可使用new Headers()
:ajax
// 建立一個空的Headers實例 var headers = new Headers(); // 添加內容 headers.append('Content-Type', 'text/plain'); headers.append('X-My-Custom-Header', 'CustomValue'); // 檢查Headers的值 headers.has('Content-Type'); // true headers.get('Content-Type'); // "text/plain" headers.set('Content-Type', 'application/json'); // 刪除一個Header headers.delete('X-My-Custom-Header'); // 添加初始值 var headers = new Headers({ 'Content-Type': 'text/plain', 'X-My-Custom-Header': 'CustomValue' });
你可使用append
, has
, get
, set
和delete
方法來設置請求的頭。要使用Request頭,須要建立一個Request
實例:json
var request = new Request('https://davidwalsh.name/some-url', { headers: new Headers({ 'Content-Type': 'text/plain' }) }); fetch(request).then(function() { /* handle response */ });
咱們來看看Response
和Request
均可以作什麼。api
一個Request
實例表明了一個fetch的請求部分。給fetch 傳入一個request你能夠發出高級的、定製的請求:promise
一個簡單的Request
看起來是這樣的:瀏覽器
var request = new Request('https://davidwalsh.name/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
方法,這個方法在Worker API裏使用fetch 的時候頗有用。fetch的簡化調用方法:
fetch('https://davidwalsh.name/users.json', { method: 'POST', mode: 'cors', redirect: 'follow', headers: new Headers({ 'Content-Type': 'text/plain' }) }).then(function() { /* handle response */ });
使用fetch的then
方法會得到一個Response
實例。你也能夠本身建立一個。
// 在service worker測試的時候 // 使用new Response(BODY, OPTIONS)建立一個response var response = new Response('.....', { ok: false, status: 404, url: '/' }); // The fetch的 `then`會得到一個response實例 fetch('https://davidwalsh.name/') .then(function(responseObj) { console.log('status: ', responseObj.status); });
Response
實例也提供了以下的方法:
假設你有一個請求會返回JSON。
fetch('https://davidwalsh.name/demo/arsenal.json').then(function(response) { // Convert to JSON return response.json(); }).then(function(j) { // Yay, `j` is a JavaScript object console.log(j); });
固然也能夠用JSON.parse(jsonString)
,可是json方法更加簡單易用。
不是全部的接口都返回JSON格式的數據,因此還要處理一些Text/HTML類型的返回結果。
fetch('/next/page') .then(function(response) { return response.text(); }).then(function(text) { // <!DOCTYPE .... console.log(text); });
若是你想要經過fetch加載一個blob的話,會有一點不一樣:
fetch('https://davidwalsh.name/flowers.jpg') .then(function(response) { return response.blob(); }) .then(function(imageBlob) { document.querySelector('img').src = URL.createObjectURL(imageBlob); });
另外一個常常會遇到的狀況是使用AJAX提交表單數據。
fetch('https://davidwalsh.name/submit', { method: 'post', body: new FormData(document.getElementById('comment-form')) });
fetch
API很好用,可是如今還不容許取消一個請求。不管如何,有了fetch
以後,咱們能夠簡單的發出AJAX請求了。更多關於fetch 的內容能夠參考Github下他們的repo。