與Promise最主要的交互方法是經過將函數傳入它的then方法從而獲取得Promise最終的值或Promise最終最拒絕(reject)的緣由git
一個Promise必須處在其中之一的狀態:pending、fulfilled 或 rejectedgithub
「值不能被改變」指的是其identity不能被改變,而不是指其成員內容不能被改變segmentfault
一個Promise必須提供一個then方法來獲取其值或緣由。 Promise的then方法接受兩個參數:promise
jspromise.then(onFulfilled, onRejected)
複製代碼
onFulfilled
和 onRejected
都是可選參數:
onFulfilled
不是一個函數,則忽略之。onRejected
不是一個函數,則忽略之。onFulfilled
是一個函數:
promise
fulfilled
後調用,且promise
的value
爲其第一個參數promise
fulfilled
前調用onRejected
是一個函數
promise
rejected
後調用,且promise
的reason
爲其第一個參數promise rejected
前調用onFulfilled
和 onRejected
只容許在 execution context
棧僅包含平臺代碼時運行onFulfilled
和 onRejected
必須被當作函數調用 (i.e. 即函數體內的 this
爲undefined
)promise
,它的then
方法能夠調用屢次
promise fulfilled
後,全部onFulfilled
都必須按照其註冊順序執行promise rejected
後,全部OnRejected
都必須按照其註冊順序執行then
必須返回一個promise
[3.3]
onFulfilled
或 onRejected
返回了值x
, 則執行Promise
解析流程[[Resolve]](promise2, x)
onFulfilled
或 onRejected
拋出了異常e, 則promise2
應當以e爲reason
被拒絕。onFulfilled
不是一個函數且promise1
已經fulfilled
,則promise2
必須以promise1
的值fulfilled.
OnReject
不是一個函數且promise1
已經rejected
, 則promise2
必須以相同的reason
被拒絕.jspromise2 = promise1.then(onFulfilled, onRejected);
複製代碼
Promise解析過程 是以一個promise和一個值作爲參數的抽象過程,可表示爲[[Resolve]](promise, x). 過程以下;bash
若是promise 和 x 指向相同的值, 使用 TypeError作爲緣由將promise拒絕。jsp
若是 x 是一個promise, 採用其狀態 [3.4]ide
若是x是一個對象或一個函數函數
若是 x 不是對象也不是函數,則以x爲值 fulfill promise。測試
深刻理解 Promise (上)this