前端筆記——嘗試理解並在JavaScript中使用Fetch()

2019-12-20     最美分享Coder

介紹

Fetch()方法可以發出類似於XMLHttpRequest(XHR)的網絡請求。Fetch API和XMLHttpRequest之間的主要區別(也稱為XHR)是Fetch API使用Promises,可以編寫更簡潔的API調用,從而嚴格避免回調地獄並降低XMLHttpRequest的複雜性






使用之前

  • 使用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重寫上面的代碼。我們可以使用多種方式使用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。這些響應類型指示資源的來源,這也讓你知道如何處理響應:

  • 解釋:
  • 當來自同一來源的請求時,響應將具有基本類型,並且可以從響應中看到的內容沒有任何限制;
  • 如果從其他來源發出請求,則響應將具有CORS類型。除了CORS響應將可以查看的標頭限制為Cache-Control,Content-Language,Content-Type,Expires和Last-Modified外,CORS和基本響應類型幾乎相同;
  • opaque響應是針對來自其他來源的資源(不返回CORS標頭)的請求。這種類型的響應讀取不了返回的數據或查看請求的狀態,這意味著無法檢查請求是否成功。

用fetch發出POST請求

除了可以從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上傳文件

我們還可以使用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請求而創建的。


文章來源: https://twgreatdaily.com/6sTiJG8BMH2_cNUg_LEb.html