Promise 是 CommonJS 中的規范,它能夠幫助我們控制代碼流程,避免函數的多層嵌套。現在 Web 前端異步編程越來越普遍,它的出現讓異步編程變得更佳的容易理解。由于它越來越受到重視,ES6 已經開始支持它了。
什么是 Promise?
Promise 是一種異步編程的模型。它有三種狀態:pending、resolved 和 rejected;一個 Promise 的狀態只可能從 pending 轉到 resolved 或者 rejected,不能逆向轉換;同時 resolved 和 rejected 狀態是不能相互轉換的。
Promise 必須實現 then 方法,then 方法可以接受兩個回調函數,第一個是操作成功時(狀態變為 resolved)的回調,第二個是操作失敗時(狀態變為 rejected)的回調。
Promise 的優缺點:
- [優勢]在異步編程中即保證代碼簡潔(避免嵌套),又讓代碼有異步運行的能力;
- [缺點]無法取消 Promise,一旦新建它就會立即執行,無法中途取消;
- [缺點]如果不設置回調函數,Promise 內部拋出的錯誤,不會反應到外部;
- [缺點]當處于 Pending 狀態時,無法得知目前進展到哪一個階段;
ES6 中的 Promise
Promise.prototype.then()
then 方法返回的是一個新的 Promise 實例,但是它并不是原來那個 Promise 實例。這樣就可以采用鏈式的寫法,即 then 方法后面在調用另外一個 then。
Promise.prototype.catch()
catch 方法是指發生錯誤時的回調函數:
Promise.all()
all 方法用于將多個 Promise 實例,包裝成一個新的 Promise 實例。
Promise.race()
race 方法同樣是將多個 Promise 實例,包裝成一個新的 Promise 實例。
Promise.resolve()
Promise.reject()
done()
finally()