前言
Node.js 7.6 已經支持 async/await 了,如果你還沒有試過,這篇博客將告訴你為什么要用它。
Async/Await 簡介
對于從未聽說過 async/await 的朋友,下面是簡介:
async/await 是寫異步代碼的新方式,以前的方法有回調函數和Promise。 async/await 是基于 Promise 實現的,它不能用于普通的回調函數。 async/await 與 Promise 一樣,是非阻塞的。 async/await 使得異步代碼看起來像同步代碼,這正是它的魔力所在。Async/Await 語法
示例中,getJSON 函數返回一個 promise,這個 promise 成功 resolve 時會返回一個 json 對象。我們只是調用這個函數,打印返回的 JSON 對象,然后返回”done”。
使用 Promise 是這樣的:
const makeRequest = () =>getJSON().then(data => {console.log(data);return "done";});makeRequest();使用 Async/Await 是這樣的:
const makeRequest = async () => {console.log(await getJSON());return "done";};makeRequest();它們有一些細微不同:
函數前面多了一個 async 關鍵字。await 關鍵字只能用在 async 定義的函數內。async 函數會隱式地返回一個 promise,該 promise 的 reosolve 值就是函數 return 的值。(示例中 reosolve 值就是字符串”done”)
第 1 點暗示我們不能在最外層代碼中使用 await,因為不在 async 函數內。
// 不能在最外層代碼中使用awaitawait makeRequest();// 這是會出事情的makeRequest().then(result => {// 代碼});await getJSON()表示 console.log 會等到 getJSON 的 promise 成功 reosolve 之后再執行。
為什么 Async/Await 更好?
1. 簡潔
由示例可知,使用 Async/Await 明顯節約了不少代碼。我們不需要寫.then,不需要寫匿名函數處理 Promise 的 resolve 值,也不需要定義多余的 data 變量,還避免了嵌套代碼。這些小的優點會迅速累計起來,這在之后的代碼示例中會更加明顯。
2. 錯誤處理
Async/Await 讓 try/catch 可以同時處理同步和異步錯誤。在下面的 promise 示例中,try/catch 不能處理 JSON.parse 的錯誤,因為它在 Promise 中。我們需要使用.catch,這樣錯誤處理代碼非常冗余。并且,在我們的實際生產代碼會更加復雜。
const makeRequest = () => {try {getJSON().then(result => {// JSON.parse可能會出錯const data = JSON.parse(result);console.log(data);});// 取消注釋,處理異步代碼的錯誤// .catch((err) => {// console.log(err)// })} catch (err) {console.log(err);}};使用 async/await 的話,catch 能處理 JSON.parse 錯誤:
const makeRequest = async () => {try {// this parse may failconst data = JSON.parse(await getJSON());console.log(data);} catch (err) {console.log(err);}};            
新聞熱點
疑難解答
圖片精選