談談你對Promise的理解


這是一個見仁見智的問題

個人總結:

  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的理解》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM