這是一個見仁見智的問題
個人總結:
Promise 是異步編程的一種解決方案,將異步操作以同步操作的流程表達出來,避免了回調地獄的問題。
Promise 是一個構造函數,我們可以通過該構造函數來生成Promise的實例。
Promise
對象有以下兩個特點:
(1)對象的狀態不受外界影響。Promise 即承諾,后續必要兌現,一旦兌現則不可更改!其有三種狀態:pending
(進行中)、fulfilled
(已成功)和rejected
(已失敗)。
(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise
對象只有兩種狀態改變:從pending
變為fulfilled
和從pending
變為rejected
。只要這兩種情況發生,狀態就不會再變了。
Promise
也有一些缺點:
首先,無法取消Promise
,一旦新建它就會立即執行,無法中途取消。
其次,如果不設置回調函數,Promise
內部拋出的錯誤,不會反應到外部。
第三,當處於pending
狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。
Promise 的實例可以看做是一個狀態展示器,我們可以將擁有狀態及改變狀態的業務通過Promise來實現,然后再結合async function進一步提升程序的可讀性及易維護性。
Promise雖然解決了我們項目開發中的很多問題,但我們也不能無腦的濫用。比如Promise.all,如果參數中promise有一個失敗(rejected),則此實例回調必然失敗(reject),就不會再執行then方法的回調了。在實際中可能只是一個不關鍵的數據加載失敗,往往會導致其他所有的數據不會顯示,使得項目的容錯性大大降低。所以在開發過程中只會在必須依賴這幾個步驟全部加載成功后才能繼續向下執行的場景中采用它,比如繼某一個函數執行結果之后再進行入后續操作、圖片的預加載。
以上綜合參考了:阮一峰的《ECMAScript 6 入門》的Promise一章和張培躍的《web前端面試題對答篇:談談你對Promise的理解》