歡迎訪問個人我的博客:http://www.xiaolongwu.cnhtml
答:Ajax是一種能夠在瀏覽器和服務器之間使用異步數據傳輸(HTTP請求)的技術。使用它可讓頁面請求少許的數據,而不用刷新整個頁面。而傳統的頁面(不使用Ajax)要刷新部份內容,必須重載整個網頁頁面。vue
答:它基於的是XMLHttpRequest(XHR)。這是一個比較粗糙的API,不符合關注分離的設計原則(Separation of Concerns),配置和使用都不是那麼友好。react
答:基於上面的緣由,各類ajax庫引用而生,然而最有名的就是jQuery的API中的 $.ajax() 。 $.ajax() 它的一個優點異步操做,但jQuery的異步操做是基於事件的異步模型,沒有promise那麼友好。ios
答:綜合上面所講的各類因素,fetch這個api應運而生,它和XMLHttpRequest都是瀏覽器window對象的原生api。但好用歸好用,它存在着一些問題(這個問題下面詳講,並講解相對應的解決方案),再加上兼容性問題(ie11如下壓根不支持),因此不少開發者使用了axios這個第三方庫。git
答:axios 這個庫如今是一個比較通用的行業解決方案,axios 流行開來的一個緣由是promise,另外一個緣由是基於數據操做的庫的流行(vue.js, angular.js, react.js等),而傳統的jQuery是基於dom操做的庫。但它也存在着缺陷,就是咱們使用前,要保證這個庫已經被引入。github
其實,就我我的而言,我仍是比較喜歡使用fetch的。在開發中遇到兼容性的問題,只須要同構fetch便可,而不須要額外的引入一個庫。下面就重點說一下fetch。ajax
fetch(url, options) .then(response => console.log(responese)) .catch(err => console.log(err))
url:請求的地址json
options: 請求的相關參數配置axios
response:請求返回的對象api
then:正常返回數據
catch: 返回異常
請求參數配置 options 詳情可參考MDN fetch 我在這裏就再也不贅述
fetch('https://api.github.com/users') .then(res => { console.log(res) return res.text() }) .then(data => { console.log(data) })
fetch的使用須要瀏覽器支持promise, fetch的返回值也是一個promise對象;
經過上面的代碼,能夠發現直接打印返回的 Response 對象中壓根就沒有數據,要想獲取到所需的數據,必須經一箇中間的方法 response.text() (fetch提供了5中方法),以下:
// 具體功能請自行查閱 arrayBuffer() blob() json() text() formData()
而fetch的封裝庫axios解決了這個問題,使用起來就要方便的多,它返回的 Response 對象中卻有數據,在 data 屬性內。參考代碼以下:
axios.get('https://api.github.com/users') .then(res => console.log(res));
解決這個問題,須要在 options 中配置 {credentials: 'include'}
也就是說 catch 方法並不能捕獲全部的錯誤,當錯誤能夠用一個狀態碼(如:404,500等)的形式表示時,fetch 返回的 Promise 不會擁有reject,只有當網絡故障或請求被阻止時 catch 纔有效。
解決這個問題,咱們可判斷 Response 對象中的 ok 是否爲true,若是不是,用 Promise 手動添加一個 reject 便可。參考代碼以下:
fetch('https://api.github.com/usrs') .then(res => { if (res.ok) { return res.text() } else { return Promise.reject('請求失敗') } }) .then(data => { console.log(data) }) .catch(err => { console.log(err) })
固然,若是是用axios庫就不須要考慮這個問題,由於axios已經爲咱們封裝好了;
async和await是es7的api,在實際開發中加入一些polyfill庫,好比最流行的的babel,咱們就可使用它們了;
若是你還不瞭解它們,請跳轉至:用async/await來處理異步
在實際中咱們會常常遇到異步嵌套的問題,好比:
fetch('https://api.github.com/usrs') .then(res => { if (res.ok) { return res.text() } else { return Promise.reject('請求失敗') } }) .then(data => { let url = data.url fetch(url) .then(res => { if (res.ok) { return res.text() } else { return Promise.reject('請求失敗') } }) .then(data => { console.log(data) }) }) .catch(err => { console.log(err) })
上面就是在收到相應以後再發起一個請求,這樣的代碼是否是看着很難受;
下面咱們來用async和await改一下,感覺一下用同步的方式寫異步的感受:
// 封裝aa async function aa() { try { let res = await fetch('https://api.github.com/usrs') let data = await res.text() let url = data.url let res1 = await fetch(url) let data1 = await res1.text() console.log(data) } catch(e) { console.log("error", e) } } // 調用aa aa()
看看上面的代碼是否是舒服多了 ,也簡單多了;
github資源地址:js基礎進階--從ajax到fetch的理解
個人CSDN博客地址:https://blog.csdn.net/wxl1555
若是您對個人博客內容有疑惑或質疑的地方,請在下方評論區留言,或郵件給我,共同窗習進步。
郵箱:wuxiaolong802@163.com