promise 是非同步程式設計的一種解決方案,比傳統的解決方案——**函式和事件——更合理和更強大。原生提供了promise 物件。promise 簡單說就是乙個容器,裡面儲存著之後才執行的事件。從語法層面來說,promise 是乙個物件,從它可以獲取非同步操作的訊息。promise 提供統一的 api,各種非同步操作都可以用同樣的方法進行處理。
(1)首先promise物件的狀態不受外界影響。其次promise物件代表乙個非同步操作,有三種狀態:pending
(進行中)、fulfilled
(已成功)和rejected
(已失敗)。只有非同步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。promise
物件的狀態改變,只有兩種可能:從pending
變為fulfilled
和從pending
變為rejected
。只要這兩種情況發生,狀態就固定了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型)。如果改變已經發生了,你再對promise
物件新增**函式,也會立即得到這個結果。
1.基本的語法如下:
var promise = new promise(functionpromise()中的引數是乙個函式,該函式有兩個引數乙個是resolve另乙個是reject,這兩個引數的型別也是函式、(resolve, reject)
else
});promise
.then(
function
()) .
catch(function
())
resolve函式的作用是,將promise物件的狀態從「未完成」變為「成功」(即從 pending 變為 resolved),在非同步操作成功時呼叫,並將非同步操作的結果,作為引數傳遞給then中的方法。
reject
函式的作用是,將promise
物件的狀態從「未完成」變為「失敗」(即從 pending 變為 rejected),在非同步操作失敗時呼叫,並將非同步操作報出的錯誤,作為引數傳遞給catch方法。
接下來是舉乙個栗子:
其輸出結果為:'then'是在promise非同步之後才呼叫到,promise物件在定義的時候回執行一遍所以輸出了『num』,之後按執行順序輸出『hi!』。
then()方法主要用來接收resolve傳遞出來的引數,其實then還有第二個引數也為函式型別,第二個引數是可選的,是用來接收reject傳遞出來的引數。
值得一提的是then() 方法放回的是乙個新的promise物件,這就意味著then方法支援鏈式呼叫。舉個栗子先:
輸出如下:第乙個then函式的返回值傳遞給了作為第二個then的引數傳遞給了第二個then方法。
如果非同步操作丟擲錯誤,狀態就會變為rejected
,就會呼叫catch
方法指定的**函式,處理這個錯誤。catch方法與then方法不同的是不支援鏈式呼叫。
finally
方法用於指定不管 promise 物件最後狀態如何,都會執行的操作。該方法不接受任何引數,接受不到promise傳遞出來的引數,不管是resolve方法還是reject方法傳遞的引數都不起作用。
all()方法用於將多個 promise 例項,包裝成乙個新的 promise 例項,promise.all()
方法接受乙個陣列作為引數,p1
、p2
、p3
都是 promise 例項
ES6 學習 Promise物件
1.promise含義 可以將promise物件看成是乙個容器,它儲存著未來才會結束的某個事件 一般是非同步操作事件 的結果,各 種非同步操作都可以用promise物件來處理 promise的特點 1 promise物件有三個狀態 pending 進行中 fulfilled 已成功 和rejecte...
ES6之Promise學習與實踐
1.前言 在平時的業務開發中,前端通常需要請求後台獲取資料,或者nodejs讀取檔案等等一系列的非同步操作,我們通常需要利用非同步操作的結果或者對非同步操作的結果進行處理。通常我們的解決方案是 在非同步操作成功或者失敗的 函式裡面寫方法,在非同步操作比較簡單的時候這樣寫 還是比較好理解的,當業務逐漸...
談談 ES6 的 Promise 物件
ajax 如果幾個非同步操作之間並沒有前後順序之分 例如不需要前乙個請求的結果作為後乙個請求的引數 時,同樣需要等待上乙個操作完成再實行下乙個操作。function helloworld ready else helloworld true then function message functio...