在咱們以前學習的內容中,向服務器發送請求後,再瀏覽器中響應的頁面都是整頁刷新。前端
在某些項目中,咱們只但願獲取頁面的局部數據,而沒必要整頁刷新,這個時候就須要使用Ajax來實現功能了。ajax
Ajax 的全稱是Asynchronous JavaScript and XML(異步的JavaScript 和 XML)。這個概念出現的比較早,那個時候前端和後臺的數據交互主要以XML格式爲主,例以下面的數據格式:json
1 <fruit> 2 <name>apple</name> 3 <weight>0.5kg</weight> 4 <color>red</color> 5 </fruit>
如今仍然存在不少用xml交互數據的狀況,可是目前主流的數據格式使用的是json(JavaScript對象表示法),例以下面的格式:瀏覽器
1 { 2 "fruit":{ 3 "name":"apple", 4 "weight":"0.5kg", 5 "color":"red" 6 } 7 }
對於熟悉js的開發人員,這樣的格式再熟悉不過了,基本是零學習成本,之後咱們使用Ajax傳遞數據都是使用json格式。服務器
考慮一個問題,在以前的學習內容中,咱們是如何向服務器發送請求的?這裏咱們列舉一下:app
Ajax的原理是經過XMLhttpRequest
對象向服務器發送請求,實例代碼以下所示:異步
1 //後臺程序 2 router.get("/", async ctx => { 3 await ctx.render("index") 4 }) 5 router.get("/data", async ctx => { 6 ctx.body = "hello world" 7 }) 8 9 //前端程序 10 var xhr = new XMLHttpRequest(); //建立XHR對象 11 xhr.open("get","/data"); //規定請求類型 12 xhr.send() //發送請求 13 xhr.onreadystatechange = function(){ //監聽readyState事件 14 // 0: 請求未初始化 15 // 1: 服務器鏈接已創建 16 // 2: 請求已接收 17 // 3: 請求處理中 18 // 4: 請求已完成,且響應已就緒 19 if(xhr.readyState === 4 && xhr.status === 200){ 20 alert(xhr.responseText) 21 } 22 }
這裏須要注意的是,上面的代碼,咱們在實際開發項目中並不經常使用,由於一般狀況下,咱們會引入第三方Ajax庫來處理異步請求。async
將上面的程序封裝到一個myAjax方法,實例代碼以下所示,這裏須要注意的是,由於Ajax是異步的操做,所以封裝的Ajax不能用return獲取返回值。下面的示例使用的是回調函數封裝的Ajax方法函數
1 function myAjax(method,url,next) { 2 let xhr = new XMLHttpRequest(); 3 xhr.open(method, url); 4 xhr.send() 5 xhr.onreadystatechange = function () { 6 if (xhr.readyState === 4 && xhr.status === 200) { 7 next(xhr.responseText); 8 } 9 } 10 } 11 12 document.querySelector("button").onclick = function() {//調用封裝的Ajax 13 myajax("get","/data",function(data){ 14 alert(data); 15 }); 16 }
過多的使用回調函數會讓程序變得很難維護,接下來咱們用Promise從新封裝ajax方法,示例代碼以下所示:性能
1 function myajax(method, url, next) { 2 return new Promise(function (resolve,reject) { 3 let xhr = new XMLHttpRequest(); 4 xhr.open(method, url); 5 xhr.send(); //能夠向後臺傳輸數據 6 xhr.onreadystatechange = function () { 7 if (xhr.readyState === 4 && xhr.status === 200) { 8 resolve(xhr.responseText); 9 } 10 } 11 reject("獲取數據失敗") 12 }) 13 } 14 document.querySelector("button").onclick = async function () { 15 let p = myajax("get", "data"); 16 p.then(function (data) { 17 alert(data); 18 }) 19 }
使用async函數纔是處理異步問題的終極解決方案,因此在後續的開發中,儘可能使async函數來處理異步問題。
獨立完成封裝XMLHttpRequest對象,並獲取後臺的字符串數據。