首先看下這段代碼:json
async function submit(){ console.log('請求開始!') let data = await fetch('127.0.0.1:8888') .then(res => res.json()) .then(res => { console.log('請求成功!') return res }) console.log('請求結束'); } console.log('請求成功了麼?');
執行這這段代碼,你會發現控制板輸出的數據順序promise
'請求成功了麼?' '請求開始!' '請求成功!' '請求結束!'
MDN:異步
async function 聲明用於定義一個返回 AsyncFunction 對象的異步函數。異步函數是指經過事件循環異步執行的函數,它會經過一個隱式的 Promise 返回其結果。可是若是你的代碼使用了異步函數,它的語法和結構會更像是標準的同步函數。
通俗的講,就是「異步」。讓這個fn支持異步繼續,因此首先打印出來的是async
'請求成功了麼?'
async利用了影藏的promise對象,來控制函數異步進行,因此你在執行async中,console會出來一個promise對象。函數
同時須要搭配await來阻塞內部異步,來說操做fetch
MDN:code
await表達式會暫停當前「async function」的執行,等待Pormise處理完成,若Promise正常處理,則回調的resolve函數做爲await表達式的值,繼續進行async function。
一個 Promise 對象或者任何要等待的值。orm
返回 Promise 對象的處理結果。若是等待的不是 Promise 對象,則返回該值自己。對象
因此上面代碼,內部的執行順序是事件
async function submit(){ // 開始執行 console.log('請求開始!') // 遇到await,等待處理結果 let data = await fetch('127.0.0.1:8888') .then(res => res.json()) .then(res => { // 處理完成,返回處理結果 console.log('請求成功!') return res }) // 等待await處理完成後,執行。 console.log('請求結束'); }
Promise
,則把該值轉換爲已常常處理的Promise
,等待處理結構(就是拋出該值)async function f2() { var y = await 20; console.log(y); // 20 } f2();
await能夠阻塞主函數,直到後面的Promise對象處理完成,這就很容易的解決了按順控制異步操做。