Promise 對象的出現(xiàn),大家都知道是為了解決"回調(diào)函數(shù)地獄"(callback hell)。它不是新的語法功能,而是一種新的寫法,允許將回調(diào)函數(shù)的嵌套,改成鏈?zhǔn)秸{(diào)用。我試著用思維導(dǎo)圖的方式整理了一下Promise的基本用法。

ES6 規(guī)定,Promise對象是一個構(gòu)造函數(shù),用來生成Promise實(shí)例,該函數(shù)的兩個參數(shù)分別是resolve和reject。它們是兩個函數(shù),由 JavaScript 引擎提供,不用自己部署。
Promise 新建后就會立即執(zhí)行,如果調(diào)用resolve函數(shù)和reject函數(shù)時帶有參數(shù),那么它們的參數(shù)會被傳遞給回調(diào)函數(shù)。
注意點(diǎn):
1.調(diào)用resolve或reject并不會終結(jié) Promise 的參數(shù)函數(shù)的執(zhí)行:
因?yàn)榱⒓?resolved 的 Promise 是在本輪事件循環(huán)的末尾執(zhí)行,總是晚于本輪循環(huán)的同步任務(wù)。

一般來說,調(diào)用resolve或reject以后,Promise 的使命就完成了,后繼操作應(yīng)該放到then方法里面,而不應(yīng)該直接寫在resolve或reject的后面。所以,最好在它們前面加上return語句,這樣就不會有意外。

2.最好不要在then方法里面定義 Reject 狀態(tài)的回調(diào)函數(shù)(即then的第二個參數(shù)),總是使用catch方法:

上面代碼中,第二種寫法要好于第一種寫法,理由是第二種寫法可以捕獲前面then方法執(zhí)行中的錯誤,也更接近同步的寫法(try/catch)。因此,建議總是使用catch方法,而不使用then方法的第二個參數(shù),catch方法返回的還是一個 Promise 對象,因此后面還可以接著調(diào)用then方法。
跟傳統(tǒng)的try/catch代碼塊不同的是,如果沒有使用catch方法指定錯誤處理的回調(diào)函數(shù),Promise 對象拋出的錯誤不會傳遞到外層代碼,即不會有任何反應(yīng)。Promise 內(nèi)部的錯誤不會影響到 Promise 外部的代碼,通俗的說法就是“Promise 會吃掉錯誤”。因此Promise 對象后面總是要跟catch方法,這樣可以處理 Promise 內(nèi)部發(fā)生的錯誤。
Promise 的最大問題是代碼冗余,原來的任務(wù)被 Promise 包裝了一下,不管什么操作,一眼看去都是一堆then,原來的語義變得很不清楚,更好的方法是:Generator函數(shù),async函數(shù)
參考文章鏈接: