做者:Danny Markov
譯者:前端小智
來源:tutorialzine
點贊再看,微信搜索
【大遷世界】關注這個沒有大廠背景,但有着一股向上積極心態人。本文
GitHub
https://github.com/qq44924588... 上已經收錄,文章的已分類,也整理了不少個人文檔,和教程資料。**
最近開源了一個 Vue 組件,還不夠完善,歡迎你們來一塊兒完善它,也但願你們能給個 star 支持一下,謝謝各位了。javascript
github 地址:https://github.com/qq44924588...前端
在本教程中,咱們將學習如何使用 JS 進行AJAX調用。vue
術語AJAX 表示 異步的 JavaScript 和 XML。java
AJAX 在 JS 中用於發出異步網絡請求來獲取資源。固然,不像名稱所暗示的那樣,資源並不侷限於XML,還用於獲取JSON、HTML或純文本等資源。ios
有多種方法能夠發出網絡請求並從服務器獲取數據。 咱們將一一介紹。git
XMLHttpRequest
對象(簡稱XHR)在較早的時候用於從服務器異步檢索數據。github
之因此使用XML,是由於它首先用於檢索XML數據。如今,它也能夠用來檢索JSON, HTML或純文本。web
function success() { var data = JSON.parse(this.responseText) console.log(data) } function error (err) { console.log('Error Occurred:', err) } var xhr = new XMLHttpRequest() xhr.onload = success xhr.onerror = error xhr.open("GET", ""https://jsonplaceholder.typicode.com/posts/1") xhr.send()
咱們看到,要發出一個簡單的GET請求,須要兩個偵聽器來處理請求的成功和失敗。咱們還須要調用open()
和send()
方法。來自服務器的響應存儲在responseText
變量中,該變量使用JSON.parse()
轉換爲JavaScript 對象。chrome
function success() { var data = JSON.parse(this.responseText); console.log(data); } function error(err) { console.log('Error Occurred :', err); } var xhr = new XMLHttpRequest(); xhr.onload = success; xhr.onerror = error; xhr.open("POST", "https://jsonplaceholder.typicode.com/posts"); xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8"); xhr.send(JSON.stringify({ title: 'foo', body: 'bar', userId: 1 }) );
咱們看到POST請求相似於GET請求。 咱們須要另外使用setRequestHeader
設置請求標頭「Content-Type」 ,並使用send方法中的JSON.stringify
將JSON正文做爲字符串發送。json
早期的開發人員,已經使用了好多年的 XMLHttpRequest
來請求數據了。 現代的fetch API
容許咱們發出相似於XMLHttpRequest(XHR)
的網絡請求。 主要區別在於fetch()
API使用Promises,它使 API更簡單,更簡潔,避免了回調地獄。
Fetch 是一個用於進行AJAX調用的原生 JavaScript API,它獲得了大多數瀏覽器的支持,如今獲得了普遍的應用。
fetch(url, options) .then(response => { // handle response data }) .catch(err => { // handle errors });
API參數
fetch()
API有兩個參數
options
是一個可選參數。不須要提供這個參數來發出簡單的GET請求。
headers: 請求頭,如 { 「Content-type」: 「application/json; charset=UTF-8」 }
API返回Promise對象
fetch()
API返回一個promise對象。
.catch()
塊中處理。200
、404
、500
),則promise將被解析。響應對象能夠在.then()
塊中處理。錯誤處理
請注意,對於成功的響應,咱們指望狀態代碼爲200
(正常狀態),可是即便響應帶有錯誤狀態代碼(例如404
(未找到資源)和500
(內部服務器錯誤)),fetch()
API 的狀態也是 resolved
,咱們須要在.then()
塊中顯式地處理那些。
咱們能夠在response
對象中看到HTTP狀態:
true
。const getTodoItem = fetch('https://jsonplaceholder.typicode.com/todos/1') .then(response => response.json()) .catch(err => console.error(err)); getTodoItem.then(response => console.log(response));
Response { userId: 1, id: 1, title: "delectus aut autem", completed: false }
在上面的代碼中須要注意兩件事:
fetch
API返回一個promise對象,咱們能夠將其分配給變量並稍後執行。response.json()
將響應對象轉換爲JSON錯誤處理
咱們來看看當HTTP GET
請求拋出500錯誤時會發生什麼:
fetch('http://httpstat.us/500') // this API throw 500 error .then(response => () => { console.log("Inside first then block"); return response.json(); }) .then(json => console.log("Inside second then block", json)) .catch(err => console.error("Inside catch block:", err));
Inside first then block ➤ ⓧ Inside catch block: SyntaxError: Unexpected token I in JSON at position 4
咱們看到,即便API拋出500錯誤,它仍然會首先進入then()
塊,在該塊中它沒法解析錯誤JSON並拋出catch()
塊捕獲的錯誤。
這意味着若是咱們使用fetch()
API,則須要像這樣顯式地處理此類錯誤:-
fetch('http://httpstat.us/500') .then(handleErrors) .then(response => response.json()) .then(response => console.log(response)) .catch(err => console.error("Inside catch block:", err)); function handleErrors(response) { if (!response.ok) { // throw error based on custom conditions on response throw Error(response.statusText); } return response; }
➤ Inside catch block: Error: Internal Server Error at handleErrors (Script snippet %239:9)
fetch('https://jsonplaceholder.typicode.com/todos', { method: 'POST', body: JSON.stringify({ completed: true, title: 'new todo item', userId: 1 }), headers: { "Content-type": "application/json; charset=UTF-8" } }) .then(response => response.json()) .then(json => console.log(json)) .catch(err => console.log(err))
Response ➤ {completed: true, title: "new todo item", userId: 1, id: 201}
在上面的代碼中須要注意兩件事:-
POST
請求相似於GET
請求。 咱們還須要在fetch()
API的第二個參數中發送method
,body
和headers
屬性。JSON.stringify()
將對象轉成字符串請求body
參數Axios API很是相似於fetch API,只是作了一些改進。我我的更喜歡使用Axios API而不是fetch()
API,緣由以下:
axios.get()
,爲 POST 請求提供 axios.post()
等提供不一樣的方法,這樣使咱們的代碼更簡潔。catch()
塊中處理的錯誤,所以咱們無需顯式處理這些錯誤。// 在chrome控制檯中引入腳本的方法 var script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'https://unpkg.com/axios/dist/axios.min.js'; document.head.appendChild(script);
axios.get('https://jsonplaceholder.typicode.com/todos/1') .then(response => console.log(response.data)) .catch(err => console.error(err));
Response { userId: 1, id: 1, title: "delectus aut autem", completed: false }
咱們能夠看到,咱們直接使用response得到響應數據。數據沒有任何解析對象,不像fetch()
API。
錯誤處理
axios.get('http://httpstat.us/500') .then(response => console.log(response.data)) .catch(err => console.error("Inside catch block:", err));
Inside catch block: Error: Network Error
咱們看到,500錯誤也被catch()
塊捕獲,不像fetch()
API,咱們必須顯式處理它們。
axios.post('https://jsonplaceholder.typicode.com/todos', { completed: true, title: 'new todo item', userId: 1 }) .then(response => console.log(response.data)) .catch(err => console.log(err))
{completed: true, title: "new todo item", userId: 1, id: 201}
咱們看到POST方法很是簡短,能夠直接傳遞請求主體參數,這與fetch()API不一樣。
代碼部署後可能存在的BUG無法實時知道,過後爲了解決這些BUG,花了大量的時間進行log 調試,這邊順便給你們推薦一個好用的BUG監控工具 Fundebug。
原文:https://tutorialzine.com/2017...
文章每週持續更新,能夠微信搜索【大遷世界 】第一時間閱讀,回覆【福利】有多份前端視頻等着你,本文 GitHub https://github.com/qq449245884/xiaozhi 已經收錄,歡迎Star。