Promise 講解如何簡單使用方法


在JavaScript的世界中,所有代碼都是單線程執行的。

由於這個“缺陷”,導致JavaScript的所有網絡操作,瀏覽器事件,都必須是異步執行。異步執行可以用回調函數實現:

function callback() {
    console.log('Done');
}
console.log('before setTimeout()');
setTimeout(callback, 1000); // 1秒鐘後調用callback函數
console.log('after setTimeout()');

觀察上述代碼執行,在Chrome的控制檯輸出可以看到:

before setTimeout()
after setTimeout()
(等待1秒後)
Done

一、promise是什麼?

1、主要用於異步計算
2、可以將異步操作隊列化,按照期望的順序執行,返回符合預期的結果
3、可以在對象之間傳遞和操作promise,幫助我們處理隊列

二、promise的優缺點

優點:

  • 對象的狀態不受外界的影響,只有異步操作的結果可以決定是那種狀態;
  • 狀態一旦改變,就不會再次改變。任何時候都可以得到這個結果。在這裏跟(event)事件不同,如果錯過了這個事件結果再去監聽,是監聽不到event事件的。

缺點:

  • promise一旦執行無法取消。
  • 如果不設置回調函數promise內部拋出的錯誤,不會反映到外部。
  • 當處於pending(進行中)的狀態時,無法得知進行到那一階段(剛開始或者即將完成)。

三、promise方法的使用

3.1 promise.then

then方法:then方法返回的是一個新的promise實例。

注意:如果採用鏈式的then,可以指定一組按照次序調用的回調函數,如果前一個回調函數返回的是promise,後一個函數會等前一個狀態發生改變纔會調用。

3.2 promise.catch

catch方法:catch方法是在promise發生錯誤時的回調。

注意:如果promise狀態已經變成resolved,在拋出錯誤時無效的。promise錯誤具有‘冒泡’性質,會一直往上傳遞,直到被捕獲。

3.3 promise.all

all方法:all方法用於將多個實例包裝成一個新的promise實例。

注意:只有當所有的實例都變成fulfilled時,包裝的實例狀態,纔會變成fulfilled,此時他們的返回值會傳遞給新的回調函數,只要其中有一個被rejected,包裝的實例狀態就會變成rejected,此時第一個被rejected的實例返回值會傳遞給新的回調。

3.4 promise.race

race方法:race方法同樣是將多個實例包裝成一個新的實例。跟上面的all方法類似。

3.5 promise.allSettled

allSettled方法:allSettled方法接收一組promise實例作爲參數,包裝成一個新的實例。

注意:只有等所有的實例都返回結果,纔會結束。返回的結果不論成功失敗,狀態總是fulfilled,不會是失敗。

3.6 promise.any

any方法:接收一組promise實例作爲參數,只要有一個變爲fulfilled狀態,包裝的實例就會變成fulfilled狀態,如果所有的參數都變成rejected狀態,就會變成rejected狀態。

3.7 promise.reject

reject方法:reject方法會返回一個新的實例,狀態爲rejected。回調函數立即執行。

3.8 promise.try

try方法:在實際開發中遇到無法區分函數是同步還是異步操作時,但是還想用promise來處理,可以使用try方法。

3.9 promise.resolve

resolve方法:將現有對象轉爲promise對象,它的參數分爲四種情況:

  • 參數是一個promise實例;如果參數是promise實例,則不作修改,原樣返回。

  • 參數是一個thenable對象,是指由then方法的對象;該方法會將這個對象轉爲promise對象,然後立即執行then方法。

  • 如果不是具有then方法的對象或者根本不是對象;如果參數是一個原始值,或者是一個不具有then方法的對象,則promise。resolve方法返回一個新的promise對象,狀態爲resolved

  • 不帶有任何參數;如果不帶有任何參數會直接返回一個resolved狀態的promise對象。

3.10 promise.catch

catch方法:catch方法是在promise發生錯誤時的回調。
注意:如果promise狀態已經變成resolved,在拋出錯誤時無效的。promise錯誤具有‘冒泡’性質,會一直往上傳遞,直到被捕獲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章