国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JavaScript 的 Async/Await 完勝 Promise 的六個理由

開發 前端
Async/await 是過去幾年中添加到 JavaScript 中的最具革命性的功能之一。它讓我們意識到 promise 的語法有多混亂,并提供了直觀的替代。

[[194361]]

提醒一下各位,Node 現在從版本 7.6 開始就支持 async/await 了。如果你還沒有試過它,這里有一堆帶有示例的理由來說明為什么你應該馬上采用它,并且再也不會回頭。

貌似嵌入 gist 上的代碼在 medium 原生 app 中不行,但是在移動瀏覽器上可以。如果你是在 app 中讀本文,請點擊共享圖標,選擇“在瀏覽器中打開”,才看得到代碼片段。

Async/await 101

對于那些從未聽說過這個話題的人來說,如下是一個簡單的介紹:

  • Async/await 是一種編寫異步代碼的新方法。之前異步代碼的方案是回調和 promise。
  • Async/await 實際上是建立在 promise 的基礎上。它不能與普通回調或者 node 回調一起用。
  • Async/await 像 promise 一樣,也是非阻塞的。
  • Async/await 讓異步代碼看起來、表現起來更像同步代碼。這正是其威力所在。

語法

假設函數 getJSON 返回一個promise,而該promise的完成值是一些JSON對象。我們只想調用它,并輸出該JSON,然后返回"done"。

如下是用 promise 實現的代碼:

  1. const makeRequest = () =>   
  2.   getJSON()   
  3.     .then(data => {   
  4.     console.log(data)   
  5.   return "done"   
  6. })   
  7.  
  8. makeRequest() 

而這就是用async/await看起來的樣子:

  1. const makeRequest = async () => {   
  2.     console.log(await getJSON())   
  3.     return "done"   
  4. }   
  5.  
  6. makeRequest() 

這里有一些區別:

1.函數前面有一個關鍵字 async。await 關鍵字只用在用 async 定義的函數內。所有 async函數都會隱式返回一個 promise,而 promise 的完成值將是函數的返回值(本例中是 "done")。

2.上面一點暗示我們不能在代碼的頂層用 await,因為這樣就不是在 async 函數內。

  1. // 這段代碼在頂層不能執行   
  2. // await makeRequest()   
  3.  
  4. // 這段代碼可以執行   
  5. makeRequest().then((result) => {   
  6.     // do something   
  7. }) 

3.await getJSON() 意味著 console.log 調用會一直等待,直到 getJSON() promise 完成并打印出它的值。

為什么 Async/await 更好?

1. 簡潔干凈

看看我們少寫了多少代碼!即使在上面那個人為的示例中,很顯然我們也是節省了不少代碼。我們不必寫 .then,創建一個匿名函數來處理響應,或者給不需要用的變量一個名稱 data。我們還避免了代碼嵌套。這些小小的優勢會快速累積起來,在后面的代碼中會變得更明顯。

2. 錯誤處理

Async/await 會最終讓我們用同樣的結構( try/catch)處理同步和異步代碼變成可能。在下面使用 promise 的示例中,如果 JSON.parse 失敗的話,try/catch 就不會處理,因為它是發生在一個 prmoise 中。我們需要在 promise 上調用 .catch,并且重復錯誤處理代碼。這種錯誤處理代碼會比可用于生產的代碼中的 console.log 更復雜。

  1. const makeRequest = () => {   
  2.   try {   
  3.     getJSON()   
  4.         .then(result => {   
  5.         // this parse may fail   
  6.         const data = JSON.parse(result)   
  7.         console.log(data)   
  8.     })   
  9.     // uncomment this block to handle asynchronous errors   
  10.   // .catch((err) => {   
  11.     // console.log(err)   
  12.     // })   
  13.   } catch (err) {   
  14.     console.log(err)   
  15.   }   

現在看看用 async/await 實現的代碼。現在 catch 塊會處理解析錯誤。

  1. const makeRequest = async () => {  
  2.   try { // 這個解析會失敗    
  3.     const data = JSON.parse(await getJSON()) console.log(data)  
  4.   }  
  5.   catch (err) {  
  6.     console.log(err) 
  7.   } 

3. 條件句

假設想做像下面的代碼一樣的事情,獲取一些數據,并決定是否應該返回該數據,或者根據數據中的某些值獲取更多的細節。

  1. const makeRequest = () => {   
  2.   return getJSON()   
  3.         .then(data => {   
  4.         if (data.needsAnotherRequest) {   
  5.             return makeAnotherRequest(data)   
  6.                     .then(moreData => {   
  7.                     console.log(moreData)   
  8.             return moreData   
  9.         })   
  10.         } else {   
  11.             console.log(data)   
  12.             return data   
  13.         }   
  14.   })   

這些代碼看著就讓人頭疼。它只需將最終結果傳播到主 promise,卻很容易讓我們迷失在嵌套( 6 層)、大括號和返回語句中。

把這個示例用async / await 重寫,就變得更易于閱讀。

  1. onst makeRequest = async () => {   
  2.   const data = await getJSON()   
  3.   if (data.needsAnotherRequest) {   
  4.     const moreData = await makeAnotherRequest(data);   
  5.     console.log(moreData)   
  6.     return moreData   
  7.   } else {   
  8.     console.log(data)   
  9.     return data   
  10.   }   

4. 中間值

你可能發現自己處于一種狀態,即調用你 promise1,然后用它的返回值來調用promise2,然后使用這兩個 promise 的結果來調用 promise3。你的代碼很可能看起來像這樣:

  1. const makeRequest = () => {   
  2.   return promise1()   
  3.     .then(value1 => {   
  4.         // do something   
  5.           return promise2(value1)   
  6.             .then(value2 => {   
  7.             // do something   
  8.                 return promise3(value1, value2)   
  9.         })   
  10.       })   

如果 promise3 不需要 value1,那么很容易就可以把 promise 嵌套變扁平一點。如果你是那種無法忍受的人,那么可能就會像下面這樣,在一個 Promise.all中包含值 1 和 2,并避免更深層次的嵌套:

  1. onst makeRequest = () => {   
  2.     return promise1()   
  3.         .then(value1 => {   
  4.             // do something   
  5.             return Promise.all([value1, promise2(value1)])   
  6.         })   
  7.     .then(([value1, value2]) => {   
  8.         // do something   
  9.         return promise3(value1, value2)   
  10.     })   

這種方法為了可讀性而犧牲了語義。除了為了避免 promise 嵌套,沒有理由將 value1和value2并入一個數組。

不過用 async/await 的話,同樣的邏輯就變得超級簡單直觀了。這會讓你對你拼命讓 promise 看起來不那么可怕的時候所做過的所有事情感到懷疑。

  1. const makeRequest = async () => {   
  2.     const value1 = await promise1()   
  3.     const value2 = await promise2(value1)   
  4.     return promise3(value1, value2)   

5. 錯誤棧

假如有一段鏈式調用多個 promise 的代碼,在鏈的某個地方拋出一個錯誤。

  1. const makeRequest = () => {   
  2.     return callAPromise()   
  3.         .then(() => callAPromise())   
  4.         .then(() => callAPromise())   
  5.         .then(() => callAPromise())   
  6.         .then(() => callAPromise())   
  7.         .then(() => {   
  8.         throw new Error("oops");   
  9.     })   
  10. }   
  11.  
  12. makeRequest()   
  13.     .catch(err => {   
  14.     console.log(err);   
  15.     // output   
  16.     // Error: oops at callAPromise.then.then.then.then.then (index.js:8:13)   
  17. }) 

從 promise 鏈返回的錯誤棧沒有發現錯誤發生在哪里的線索。更糟糕的是,這是誤導的;它包含的唯一的函數名是callAPromise,它完全與此錯誤無關(不過文件和行號仍然有用)。

但是,來自async / await的錯誤棧會指向包含錯誤的函數:

  1. const makeRequest = async () => {   
  2.     await callAPromise()   
  3.     await callAPromise()   
  4.     await callAPromise()   
  5.     await callAPromise()   
  6.     await callAPromise()   
  7.     throw new Error("oops");   
  8. }   
  9.  
  10. makeRequest()   
  11.     .catch(err => {   
  12.     console.log(err);   
  13.     // output   
  14.     // Error: oops at makeRequest (index.js:7:9)   
  15. }) 

當在本地環境中開發并在編輯器中打開文件時,這不是啥大事,但是當想搞清楚來自生產服務器的錯誤日志時,就相當有用了。在這種情況下,知道錯誤發生在makeRequest中比知道錯誤來自一個又一個的 then 要好。

6. 調試

***但是同樣重要的是,在使用 async/await 時,一個殺手級優勢是調試更容易。調試 promise 一直是如此痛苦,有兩個原因:

1.沒法在返回表達式(無函數體)的箭頭函數中設置斷點。

試著在此處設置斷點

2.如果在.then塊中設置斷點,并使用像單步調試這類調試快捷方式,調試器不會移動到后面的 .then ,因為它只單步調試同步代碼。

有了 async/await,我們就不再需要那么多箭頭函數,您可以像正常的同步調用一樣單步調試 await 調用。

 

總結

Async/await 是過去幾年中添加到 JavaScript 中的***革命性的功能之一。它讓我們意識到 promise 的語法有多混亂,并提供了直觀的替代。

責任編輯:武曉燕 來源: 眾成翻譯
相關推薦

2017-04-10 15:57:10

AsyncAwaitPromise

2024-09-02 14:12:56

2023-10-08 10:21:11

JavaScriptAsync

2016-07-25 18:10:55

2023-09-28 13:27:40

Tailwind瀏覽器CSS

2021-06-07 09:44:10

JavaScript開發代碼

2016-11-22 11:08:34

asyncjavascript

2021-12-02 10:17:07

Kubernetes公共云云計算

2025-07-07 04:00:00

2018-04-23 14:27:03

2018-04-24 09:31:08

2024-03-11 14:34:04

JavaScript開發

2023-05-22 15:53:06

JavaScrip代碼素材

2025-04-11 11:55:49

2025-09-15 02:55:00

2024-04-15 12:27:00

await面試接口

2021-07-20 10:26:12

JavaScriptasyncawait

2014-07-15 10:31:07

asyncawait

2022-08-02 15:04:36

JavaScript

2012-11-05 10:33:24

創業員工程序員
點贊
收藏

51CTO技術棧公眾號

成人写真福利网| 毛片在线网址| 色呦呦网站在线观看| 国产欧美日韩综合一区在线播放| 91久久精品国产91性色tv| 黄色一级视频在线播放| 性欧美1819sex性高清| 亚洲国产cao| 99热免费观看| 成人午夜碰碰视频| 亚洲国产精品www| 亚洲免费成人av在线| 国产三级电影在线播放| 精品自拍视频| 欧美成人aa大片| 无码少妇一区二区三区芒果| 偷偷www综合久久久久久久| 国产午夜精品久久久| 中文字幕天天干| 免费成人三级| 日本道色综合久久影院| 免费大片黄在线| 少妇一区二区视频| 精品久久久精品| 日韩大片一区二区| 亚洲福利免费| 91日韩在线播放| 婷婷久久综合九色综合99蜜桃| 亚洲欧美另类久久久精品| 欧美激情国产精品日韩| 成人sese在线| 日韩欧美精品免费| 亚洲少妇一区| 欧美在线影院在线视频| 大伊香蕉精品在线品播放| 精品国产亚洲一区二区三区| 国产成人在线网站| 午夜免费福利在线| 国产一区二区三区综合| 成人h视频在线观看| 国产成人免费视频网站视频社区| 欧美日韩视频一区二区| 2025韩国理伦片在线观看| aaa欧美色吧激情视频| 97av在线视频| 999久久久国产999久久久| 亚洲热线99精品视频| 欧美性猛交xxx乱大交3蜜桃| 亚洲最新av网址| 777久久精品| 97视频人免费观看| 波多野结衣在线观看一区二区| 99免费在线观看视频| 成人99免费视频| 欧美精选一区二区三区| 一级黄色av| 亚洲精品成人免费| 成人情趣视频| v天堂福利视频在线观看| 久久久精品久久| 中国成人一区| 久久久久久久少妇| 欧美天堂一区二区三区| 风间由美一区二区av101| 日韩.欧美.亚洲| 日韩欧美国产精品一区| 女海盗2成人h版中文字幕| 亚洲男人av电影| 亚洲成a人片77777在线播放| 精品国产乱码久久久久软件| 2014亚洲片线观看视频免费| 黄上黄在线观看| 国产精品一区久久| 精品美女久久久久久免费| 美女久久久久| 成人午夜视频免费在线观看| 91精品国产高清久久久久久久久| wwwwxxxxx欧美| 国产一区二区三区香蕉| 区一区二区三区中文字幕| 国产原创一区二区三区| 在线香蕉视频| 亚洲国产成人爱av在线播放| 国产精品mm| 成人频在线观看| 久久天天躁狠狠躁老女人| 国产精品第一国产精品| 国产欧美亚洲视频| 9l国产精品久久久久麻豆| 91在线成人| 68精品国产免费久久久久久婷婷 | 国产精品美女久久久久久久久| 在线天堂资源| 亚洲美免无码中文字幕在线| 91福利在线看| 欧美午夜久久| 日韩视频第二页| 亚洲免费电影在线观看| 精品一区二区成人精品| 精品国产亚洲日本| 国产经典av| 日本精品一区二区| 少妇高潮久久久久久潘金莲| av男人天堂一区| 婷婷精品在线观看| 国产不卡一区二区视频| 国产精品白丝jk喷水视频一区| www.欧美精品一二区| 成人在线免费| 天天影视色香欲综合| 国产欧美va欧美va香蕉在| 日韩一区二区三区视频在线观看 | 成人午夜两性视频| 欧美mv日韩mv国产网站| 中文字幕乱码一区二区免费| 日韩av成人高清| 日本久久成人网| 欧美高清视频| 欧美日韩精品在线一区二区 | 欧美韩日高清| 午夜视频在线看| 男人天堂午夜在线| jk破处视频在线| 91好吊色国产欧美日韩在线| 亚洲男人天堂2024| 成人精品免费看| 亚洲欧美成人综合| 久久五月天小说| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩精品av| 国产高潮av| 熟妇人妻va精品中文字幕| 国产手机精品在线| 亚洲综合成人婷婷小说| 97超级碰在线看视频免费在线看| 在线观看视频91| 国产日产欧美一区二区三区| 国产成人精品免费| 风间由美性色一区二区三区| 激情欧美丁香| 激情亚洲成人| 久久久电影一区二区三区| 中文字幕中文字幕在线一区| 免费高清在线视频一区·| 国产日韩一区二区三免费高清| 欧美黑人视频一区| 中文字幕久久亚洲| 欧美成人精品h版在线观看| 日韩在线激情视频| 色婷婷av一区二区三区在线观看| 日韩中文字幕在线观看| 日韩欧美亚洲国产另类| 亚洲成人激情在线| 亚洲欧美一区二区在线观看| 国产色综合网| 欧美网站在线| 久久av免费| 第九色区aⅴ天堂久久香| 综合激情五月婷婷| 77成人影视| 888久久久| 欧美区日韩区| 极品美女销魂一区二区三区免费| 91精品蜜臀一区二区三区在线| 狠狠色丁香久久婷婷综合丁香| 精品国产一区二区精华| 亚洲精品99999| 欧美午夜寂寞影院| 97视频在线观看成人| 18久久久久久| 欧美一区二区三区男人的天堂| 亚洲国产又黄又爽女人高潮的| 一区二区三区黄色| 91av福利视频| 日韩电影在线播放| 日本粉色视频在线观看| 国产成人免费9x9x人网站视频| 色愁久久久久久| 亚洲天堂资源| 中文字幕色婷婷在线视频| 国产视频亚洲视频| 综合一区二区三区| 国产成人精品三级麻豆| 精品高清美女精品国产区| 欧美精品一区男女天堂| 久久天天躁夜夜躁狠狠躁2022| 国产美女久久精品香蕉69| 超碰在线免费观看97| 精品视频免费在线播放| 求av网址在线观看| 日韩欧美综合| 成人的网站免费观看| 欧美不卡一二三| 国产乱码精品一区二区三区卡| 免费男女羞羞的视频网站中文版| 玛雅亚洲电影| 丁香婷婷综合色啪| 91福利精品第一导航| 国产在线日韩在线| 国产bdsm|