Fetch()方法可以發出類似於XMLHttpRequest(XHR)的網絡請求。Fetch API和XMLHttpRequest之間的主要區別(也稱為XHR)是Fetch API使用Promises,可以編寫更簡潔的API調用,從而嚴格避免回調地獄並降低XMLHttpRequest的複雜性
在使用fetch之前,我們先可以了解下XMLHttpRequest,XMLHttpRequest需要設置兩個偵聽器來處理成功響應和錯誤響應情況,並調用open()和send()
function getAllPosts() { let data = JSON.parse(this.responseText); console.log(data);}let reqError = err => { console.log("Error", err);};let req = new XMLHttpRequest();req.onload = getAllPosts;req.onerror = reqError;req.open("GET", "https://xxxxx", true); req.send();
現在看一下「Fetch之美」。讓我們使用Fetch重寫上面的代碼。我們可以使用多種方式使用fetch方法,可以使用then方法或使用async / await方法。讓我們看看如何做到這一點:
1、使用Async/Await:
使用try/catch,async / await使處理同步和異步錯誤相對容易:
async function getAllPosts() { try { let response = await fetch("" ); const data = await response.json(); console.log(data); } catch (err) { console.log(err); } }
2、使用then
調用then方法的缺點就是容易在大量回調請求的時候造成回調地獄,很難維護代碼
function getAllPosts() { fetch("https://xxxxx") .then(response => response.json()) .then(data => { console.log(data)}) .catch(err => {console.log(err); }); }
當我們發出fetch請求時,響應會被指定為CORS類型,opaque或basic。這些響應類型指示資源的來源,這也讓你知道如何處理響應:
除了可以從api獲取數據之外,我們還可以使用Fetch方法執行其他操作。假設我們要向博客API添加一個新博客,我們也可以使用Fetch方法來完成該操作:
下面可以是一個表單提交方式:
現在,我們有了一個用於添加新博客文章的表單,讓我們編寫一個腳本,該腳本會將數據發送到添加API的請求:
document.getElementById("postData").addEventListener("submit", addNewPost); async function addNewPost(event) { try { event.preventDefault();//阻止默認行為 let tittle = document.getElementById("title").value; let body = document.getElementById("body").value; let response = await fetch("****",{ method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({ tittle: tittle, body: body }) } ); const data = await response.json(); console.log(data); } catch (err) { console.log(err); } }
我們還可以使用Fetch處理文件上傳,例如圖像和文檔:
document.getElementById("postData").addEventListener("submit", uploadfile); async function uploadfile(event) { try { event.preventDefault(); const fileField = document.querySelector('input[type="file"]'); const formData = new FormData(); formData.append("avatar", fileField.files[0]); let response = await fetch("...",{ method: "POST", headers: { "Content-Type": "application/json" }, body: formData }); const data = await response.json(); console.log(data); } catch (err) { console.log(err); } }
儘管fetch是用於發出網絡請求的更好方法,新的fetch API似乎比XHR更快,更易於使用。畢竟,它是為了使我們能夠以正確的方式處理AJAX請求而創建的。