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

使用 Promise 時的五個常見錯誤,你占了幾個

開發 前端
Promise 提供了一種優雅的方法來處理 JS 中的異步操作。這也是避免“回調地獄”的解決方案。然而,并沒有多少開發人員了解其中的內容。因此,許多人在實踐中往往會犯錯誤。

[[436808]]

Promise 提供了一種優雅的方法來處理 JS 中的異步操作。這也是避免“回調地獄”的解決方案。然而,并沒有多少開發人員了解其中的內容。因此,許多人在實踐中往往會犯錯誤。

在本文中,介紹一下使用 promise 時的五個常見錯誤,希望大家能夠避免這些錯誤。

1.避免 Promise 地獄

通常,Promise是用來避免回調地獄。但濫用它們也會導致 Promise是地獄。

  1. userLogin('user').then(function(user){ 
  2.     getArticle(user).then(function(articles){ 
  3.         showArticle(articles).then(function(){ 
  4.             //Your code goes here... 
  5.         }); 
  6.     }); 
  7. }); 

 在上面的例子中,我們對 userLogin、getararticle 和 showararticle 嵌套了三個promise。這樣復雜性將按代碼行比例增長,它可能變得不可讀。

為了避免這種情況,我們需要解除代碼的嵌套,從第一個 then 中返回 getArticle,然后在第二個 then 中處理它。

  1. userLogin('user'
  2.   .then(getArticle) 
  3.   .then(showArticle) 
  4.   .then(function(){ 
  5.        //Your code goes here... 
  6. }); 

2. 在 Promise 中使用try/catch塊

通常情況下,我們使用 try/catch 塊來處理錯誤。然而,不建議在 Promise 對象中使用try/catch 。

這是因為如果有任何錯誤,Promise對象會在 catch 內自動處理。

  1. ew Promise((resolve, reject) => { 
  2.   try { 
  3.     const data = doThis(); 
  4.     // do something 
  5.     resolve(); 
  6.   } catch (e) { 
  7.     reject(e); 
  8.   } 
  9. }) 
  10.   .then(data => console.log(data)) 
  11.   .catch(error => console.log(error)); 

在上面的例子中,我們在Promise 內使用了 try/catch 塊。

但是,Promise本身會在其作用域內捕捉所有的錯誤(甚至是打字錯誤),而不需要 try/catch塊。它確保在執行過程中拋出的所有異常都被獲取并轉換為被拒絕的 Promise。

  1. new Promise((resolve, reject) => { 
  2.   const data = doThis(); 
  3.   // do something 
  4.   resolve() 
  5. }) 
  6.   .then(data => console.log(data)) 
  7.   .catch(error => console.log(error)); 

 **注意:**在 Promise 塊中使用 .catch() 塊是至關重要的。否則,你的測試案例可能會失敗,而且應用程序在生產階段可能會崩潰。

3. 在 Promise 塊內使用異步函數

Async/Await 是一種更高級的語法,用于處理同步代碼中的多個Promise。當我們在一個函數聲明前使用 async 關鍵字時,它會返回一個 Promise,我們可以使用 await 關鍵字來停止代碼,直到我們正在等待的Promise解決或拒絕。

但是,當你把一個 Async 函數放在一個 Promise 塊里面時,會有一些副作用。

假設我們想在Promise 塊中做一個異步操作,所以使用了 async 關鍵字,但,不巧的是我們的代碼拋出了一個錯誤。

這樣,即使使用 catch() 塊或在 try/catch 塊內等待你的Promise,我們也不能立即處理這個錯誤。請看下面的例子。

  1. // 此代碼無法處理錯誤 
  2. new Promise(async () => { 
  3.   throw new Error('message'); 
  4. }).catch(e => console.log(e.message)); 
  5.  
  6. (async () => { 
  7.   try { 
  8.     await new Promise(async () => { 
  9.       throw new Error('message'); 
  10.     }); 
  11.   } catch (e) { 
  12.     console.log(e.message); 
  13.   } 
  14. })(); 

 當我在Promise塊內遇到 async 函數時,我試圖將 async 邏輯保持在 Promise 塊之外,以保持其同步性。10次中有9次都能成功。

然而,在某些情況下,可能需要一個 async 函數。在這種情況下,也別無選擇,只能用try/catch 塊來手動管理。

  1. new Promise(async (resolve, reject) => { 
  2.   try { 
  3.     throw new Error('message'); 
  4.   } catch (error) { 
  5.     reject(error); 
  6.   } 
  7. }).catch(e => console.log(e.message)); 
  8.  
  9.  
  10. //using async/await 
  11. (async () => { 
  12.   try { 
  13.     await new Promise(async (resolve, reject) => { 
  14.       try { 
  15.         throw new Error('message'); 
  16.       } catch (error) { 
  17.         reject(error); 
  18.       } 
  19.     }); 
  20.   } catch (e) { 
  21.     console.log(e.message); 
  22.   } 
  23. })(); 

4.在創建 Promise 后立即執行 Promise 塊

至于下面的代碼片斷,如果我們把代碼片斷放在調用HTTP請求的地方,它就會被立即執行。

  1. const myPromise = new Promise(resolve => { 
  2.   // code to make HTTP request 
  3.   resolve(result); 
  4. }); 

原因是這段代碼被包裹在一個Promise構造函數中。然而,有些人可能會認為只有在執行myPromise 的then方法之后才被觸發。

然而,真相并非如此。相反,當一個Promise被創建時,回調被立即執行。

這意味著在建立 myPromise 之后到達下面一行時,HTTP請求很可能已經在運行,或者至少處于調度狀態。

Promises 總是急于執行過程。

但是,如果希望以后再執行 Promises,應該怎么做?如果現在不想發出HTTP請求怎么辦?是否有什么神奇的機制內置于 Promises 中,使我們能夠做到這一點?

答案就是使用函數。函數是一種耗時的機制。只有當開發者明確地用 () 來調用它們時,它們才會執行。簡單地定義一個函數還不能讓我們得到什么。所以,讓 Promise 變得懶惰的最有效方法是將其包裹在一個函數中!

  1. const createMyPromise = () => new Promise(resolve => { 
  2.   // HTTP request 
  3.   resolve(result); 
  4. }); 

對于HTTP請求,Promise 構造函數和回調函數只有在函數被執行時才會被調用。所以現在我們有一個懶惰的Promise,只有在我們需要的時候才會執行。

5. 不一定使用 Promise.all() 方法

如果你已經工作多年,應該已經知道我在說什么了。如果有許多彼此不相關的 Promise,我們可以同時處理它們。

Promise 是并發的,但如你一個一個地等待它們,會太費時間,Promise.all()可以節省很多時間。

記住,Promise.all() 是我們的朋友

  1. const { promisify } = require('util'); 
  2. const sleep = promisify(setTimeout); 
  3.  
  4. async function f1() { 
  5.   await sleep(1000); 
  6.  
  7. async function f2() { 
  8.   await sleep(2000); 
  9.  
  10. async function f3() { 
  11.   await sleep(3000); 
  12.  
  13.  
  14. (async () => { 
  15.   console.time('sequential'); 
  16.   await f1(); 
  17.   await f2(); 
  18.   await f3(); 
  19.   console.timeEnd('sequential');   
  20. })(); 

 上述代碼的執行時間約為 6 秒。但如果我們用 Promise.all() 代替它,將減少執行時間。

  1. (async () => { 
  2.     console.time('concurrent'); 
  3.     await Promise.all([f1(), f2(), f3()]); 
  4.     console.timeEnd('concurrent');  
  5.   })(); 

總結

在這篇文章中,我們討論了使用 Promise 時常犯的五個錯誤。然而,可能還有很多簡單的問題需要仔細解決。

作者:Ravidu Perera 譯者:前端小智

來源:medium 原文:https://blog.bitsrc.io/5-common-mistakes-in-using-promises-bfcc4d62657f

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2010-11-01 09:16:13

DIV+CSS

2024-09-05 14:50:31

2017-09-11 14:26:02

大數據數據可視化數據分析圖

2022-05-31 15:43:15

自動化測試

2023-11-23 10:21:37

2021-06-16 15:04:06

JavaScript內存開發

2021-12-30 21:51:10

JavaScript開發內存

2019-10-14 16:39:50

云計算配置錯誤企業

2024-04-09 16:24:18

Promise開發

2015-07-29 10:46:20

Java錯誤

2023-04-24 08:11:02

圖片alt語音

2019-11-22 09:30:59

設計Java程序員

2025-04-16 04:00:00

2022-06-07 12:38:44

云應用安全勒索軟件網絡攻擊

2024-03-27 14:35:09

自動驗證工具

2020-07-28 07:00:00

DockerDocker Comp

2020-05-29 14:30:35

Kubernetes開發錯誤

2025-06-12 03:55:00

項目處理異常代碼

2019-10-17 16:02:44

高并發緩存瀏覽器

2021-06-28 10:12:34

云計算云平臺云計算架構
點贊
收藏

51CTO技術棧公眾號

亚洲欧美一级| 亚洲jizzjizz日本少妇| 国产成人亚洲精品无码h在线| 亚洲品质自拍| 九色91popny| 韩国av一区二区| 久久中文精品视频| h片在线观看下载| 在线观看日韩电影| 99re免费99re在线视频手机版| 手机福利小视频在线播放| 成人污污视频在线观看| 3d精品h动漫啪啪一区二区| 国产亚洲精品网站| 久久精品一二三区| 91视频最新入口| 中文亚洲字幕| 亚洲一区二区在线播放| 我不卡影院28| 欧美有码在线视频| 国产欧美日韩精品一区二区免费 | 免费网站www在线观看| 欧美激情在线观看视频免费| 无罩大乳的熟妇正在播放| 国产一区视频网站| 国产一区二区三区精彩视频 | 久久免费视频2| 成人午夜在线视频| 日韩av卡一卡二| 不卡的国产精品| 一区二区三区视频免费| 日韩小视频在线播放| 欧美激情中文字幕一区二区| 手机看片福利日韩| 国产精品麻豆一区二区| 另类图片激情| 欧美在线免费观看亚洲| 国产精品一级伦理| 日韩精品极品视频免费观看| 91成人抖音| 色婷婷一区二区三区四区| 老司机在线永久免费观看| 精品久久一区二区三区| 国产精品com| 欧美写真视频一区| 精品女同一区二区| 色综合蜜月久久综合网| 884aa四虎影成人精品一区| 电影久久久久久| 国产精品自产拍高潮在线观看| 99人久久精品视频最新地址| 狠狠97人人婷婷五月| 色妹子一区二区| 999www成人| 欧美精品一区二区三区蜜桃| 欧美一区二区福利| 精品日韩一区| 男人天堂av片| 日韩高清不卡在线| 成人黄色av播放免费| 成人高清在线视频| 午夜视频久久久| 可以免费看不卡的av网站| 成年人免费网站| 亚洲美女区一区| 欧美日韩黄网站| 欧美高清视频在线播放| 久久蜜桃精品| www.国产精品.com| 粉嫩av免费一区二区三区| 亚洲成av在线| 日韩免费在线观看av| 欧美性猛交丰臀xxxxx网站| 国产一区二区av在线| 日韩欧美在线电影| 99久久99热这里只有精品| 999sesese| 欧美伊久线香蕉线新在线| 久久久www免费人成精品| 国产精品xx| 亚洲.欧美.日本.国产综合在线| 91免费视频大全| 精品推荐蜜桃传媒| 国产成人精品视频在线| 亚洲欧美区自拍先锋| 欧美在线关看| 水莓100在线视频| 玛丽玛丽电影原版免费观看1977| 精品国产欧美一区二区| 国产综合av在线| 91精品国产麻豆| 日韩午夜高潮| 女同视频在线观看| 国产精品久久久久久福利一牛影视| 在线影院自拍| 综合视频在线观看| 7m精品福利视频导航| 日韩午夜三级在线| 久久婷婷色综合| 亚洲高清资源| 欧美国产日韩一区二区三区| 亚洲免费在线观看| 日本欧美一区二区三区| 国产成人欧美在线观看| 久久久精品综合| 国产精品视频一区二区三区综合| 亚洲欧美精品| 亚洲精品国精品久久99热一| 麻豆精品视频在线观看视频| 久久精品国产视频| 国产一区视频导航| brazzers在线观看| 一区二区三区在线观看www| 色综合中文字幕国产| av在线加勒比| 亚洲毛片在线观看| 亚洲理伦在线| 飘雪影视在线观看免费观看| 88xx成人精品| 99久久精品国产麻豆演员表| 美媛馆国产精品一区二区| 亚洲福利电影网| 亚洲美女久久| 国产日本视频| 国产91久久婷婷一区二区| 国产免费av一区二区三区| 免费在线激情视频| y97精品国产97久久久久久| 大奶在线精品| 国产九九九九九| 日韩中文字幕在线看| youjizz久久| 日韩黄色三级| 国产精品久久久久福利| 337p粉嫩大胆噜噜噜噜噜91av| 3d欧美精品动漫xxxx无尽| 欧美与动交zoz0z| 亚洲精品一区二三区不卡| 色妞ww精品视频7777| 国产不卡视频在线| 一区二区三区精品视频| 图片婷婷一区| 美女黄视频在线播放 | av片中文字幕| 欧美激情亚洲自拍| 一区二区欧美在线观看| 第一sis亚洲原创| 国产精品久久一区二区三区不卡| 精品国产第一页| 91在线高清观看| 国产不卡精品| 777视频在线观看| 91文字幕巨乱亚洲香蕉| 欧美一卡二卡三卡| av在线一区二区三区| 国产66精品| 国产永久av在线| 日本女人高潮视频| 欧美激情亚洲精品| 91黄色免费网站| 国产美女视频一区| 欧美日韩麻豆| jzzjzzjzz亚洲成熟少妇| 在线国产精品网| 久久久久久久激情视频| 色婷婷综合久久久中文字幕| 视频一区免费在线观看| 91精品视频一区二区| 美女被人操视频在线观看| 明星裸体视频一区二区| 日韩一区二区福利| 午夜精品视频一区| 一区二区三区免费在线看| 欧美jiizzhd精品欧美| 蜜桃免费一区二区三区| 日韩一区av在线| 亚洲成人在线免费| 日韩成人午夜电影| 成人三级毛片| 国产三级中文字幕| 欧美一级高清免费| 日韩美女视频在线| 91精品高清| 亚洲天堂2018av| 国产精品一区二区三区不卡 | 完全免费av在线播放| 黄瓜视频免费观看在线观看www| 色综合老司机第九色激情| 欧美日韩免费在线观看| 9l视频自拍九色9l视频成人| 日韩av视屏| 内射国产内射夫妻免费频道| 国产日韩视频在线观看| 国产精品夫妻自拍| 美女视频一区免费观看| 国产成人一二片| √8天堂资源地址中文在线| 国产网友自拍电影在线| 国产日产欧美视频| 天堂一区二区三区|