JavaScript的網絡請求異步的,即網絡請求不會阻塞當前 js 代碼的繼續執行,而是經過回調的方式,網絡請求的代碼塊中注入回調函數,當網絡請求完成,會觸發相應的事件,經過觸發事件來執行註冊的回調函數。回調的執行時間是不肯定的,所以會影響程序的執行邏輯,另外一方面,若是回調依賴過多,或致使很深的回調嵌套,使代碼的可讀性和可維護性下降。promise
async await 是 es7 中的新語法,基於 promise,使異步調用扁平化。網絡
async 用於申明一個 function 是異步的,而 await 用於等待一個異步方法異步執行完成。異步
1 async function asyncFunctionName(){ 2
3 const response =await fetch(url,options); 4
5 const result =await response.text(); 6
7 return JSON.parse( result ); 8 }
asyncFunction 返回的返回值會經過 Promise.resolve()封裝成 Promise 對象,經過 Promise.then()來獲取return 的返回值。async
await 等待的是一個實際返回值,同時await 不單單用於等待 Promise對象,它能夠用於等待任何表達式的返回,所以await後面實際是能夠接普通函數的調用或者直接量的。若是await 等到的不是一個promise對象,那await 表達式後面的運算結果就是它等到的值;若是await 等到的是一個promise對象,await 就會阻塞當前 js 的繼續執行,等着 promise 對象 reslove,獲得 resolve 的值,做爲await 表達式的運算結果。函數
由於await 會阻塞代碼的運行,因此await 必須放在async 函數體中,而async 函數的調用不會形成阻塞,它內部全部的阻塞都被封裝在一個 promise 對象中異步執行。fetch
async await的優點對比promise在於處理then鏈。在async函數體中,能夠把對異步返回值得處理程序放在 await 後面,程序會依次執行,能夠像寫同步代碼同樣寫異步回調。url
注意點:await 等待的promise 對象,運行時可能會reject ,因此最好將await 放在 try{ } catch 代碼塊中。spa
async ()=>{ try{ const response = await felch(url,options); }catch(err=>{ console.log(err) }) } // 對比 promise 鏈式調用
promise.then().catch()