Fami通票選最受期待遊戲榜 《最終幻想16》登頂
Promise 學習
回撥地獄
什麼是回撥地獄
多層回撥函式的相互巢狀,就形成了回撥地域,示例如下:
是不是很恐怖,就像是套娃一樣。
回撥地獄的缺點
- 程式碼耦合性太強,牽一髮而動全身,難以維護。
- 大量冗餘程式碼相互巢狀,程式碼的可讀性和可複用性變差。
如何解決回撥地獄問題
為了解決回撥地獄的問題,ES6中新增了 Promise的概念。
Promise 的概念
-
Promise 是一個建構函式。
我們可以建立Promise的例項
const p = new Promise()
new出來的Promise例項物件,代表一個非同步操作。 -
Promise.prototype 上包含一個
.then()
每一次
new Promise()
建構函式得到的例項物件,都可以通過原型鏈的方式訪問到.then()
方法,例如p.then()
。 -
.then() 方法用來預先指定成功和失敗的回撥函式。
p.then(成功的回撥函式,失敗的回撥函式)
p.then(result => {} , error => {} )
呼叫.then()
的時候,成功的回撥函式是必須填寫的,但是失敗的回撥函式是可以選擇的。
基於Promise按順序讀取檔案內容
就是說要去請求三個檔案,依次是檔案一、檔案二、檔案三。但是不能保證檔案的獲取順序,如果一次巢狀執行,就造成了回撥地獄,所以呢,那麼promise就派上用場了。
.then() 方法的特性
如果上一個 .then()
方法中返回了一個新的Promise
例項物件,則可以通過下一個 .then()
繼續進行處理,通過 .then()
方法的鏈式呼叫,就解決了回撥地域的問題。
Promise支援鏈式呼叫,從而解決回撥地獄的問題:
說明:本文中 thenFs 是一個讀取檔案外掛,返回的是一個 Promise 例項
通過 .catch 捕獲錯誤
在 Promise 的鏈式操作中如果發生錯誤,可以使用 Promise.prototype.catch
方法進行捕獲和處理:
當遇到錯誤,後面的 .then() 都不會在執行了,直接執行 .catch()方法中的內容。
如果我們不希望前面的錯誤導致後面的 .then() 無法正常工作,則可以將 .catch() 的呼叫提前,就像下面一樣:
Promise.all()
Promise.all()
方法會發起並行的 Promise 非同步操作,等所有的非同步操作全部結束之後才會執行下一步的 .then() 操作(等待機制)。示例程式碼:
Promise.race()
Promise.race()
方法會發起並行的 Promise 非同步操作,只要任何一個非同步操作完成,就會立即執行下一步的 .then() 操作(賽跑機制)。示例程式碼如下:
先執行完之後,後邊的都沒了就,只有一個。
Promise 呼叫 resolve 和 reject 回撥函式
Promise 非同步操作的結果,可以呼叫 resolve 或 reject 回撥函式進行處理,示例如下:
async/await
什麼是 async/await
async/await 是ES8中引入的新語法,用來簡化Promise非同步操作,在 async/await 出現之前,開發者只能通過鏈式.then()的方式處理Promise非同步操作,示例程式碼如下:
上面 .then 的鏈式呼叫方法優點是解決了回撥地獄的問題,但是程式碼比較冗餘,閱讀性差勁,不容易理解。
所以官方推出了async/await
async/await 基本使用
使用 async/await 簡化Promise非同步操作的例項程式碼如下:
使用 await 修飾過後的返回值,不再是Promise例項,而是變成了呼叫成功的值,如果方法中用到了 await,那麼這個方法必須被 async 修飾
。
async/await 使用的注意事項
- 如果在 function 中使用了 await, 那麼這個 function 必須使用 async 修飾。
- 在 async方法中,第一個await 之前的程式碼會同步執行,await之後的程式碼會非同步執行。
結束了!
【版權宣告】本博文著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處!【重要說明】本文為本菜鳥的學習記錄,論點和觀點僅代表個人不代表此技術的真理,目的是學習和可能成為向別人分享的經驗,因此有錯誤會虛心接受改正,但不代表此時博文無誤!
【部落格園地址】JayveeWong: http://www.cnblogs.com/wjw1014
【CSDN地址】JayveeWong: https://blog.csdn.net/weixin_42776111
【Gitee地址】Jayvee:https://gitee.com/wjw1014
【GitHub地址】Jayvee:https://github.com/wjw1014