promise.then()、promise.catch()、Promise.all()、、、
Promise 構造函數接受一個函數作為參數,該函數的2個參數分別是 resolve 和 reject。他們是2個函數,有 JavaScript 引擎提供,不用自己部署。
var promise = new Promise ( function ( resolve, reject) {
if ( /* 異步操作成功 */ ) {
resolve (value)
} else {
reject (error)
}
})
如果調用 resolve 函數和 reject 函數時帶有參數,那么這些參數會被傳遞給回調函數。
Promise 實例生成以后,可以用 then 方法分別指定 Resolved 狀態和 Rejected 狀態的回調函數(then 方法的作用是為 Promise 實例添加狀態改變時的回調函數)。
promise.then( function (value) {
// success
}, function (value) {
// failure
})
Promise 對象的錯誤具有“冒泡”性質,會一直向后傳遞,直到被捕獲為止。也就是說,錯誤總是會被下一個 catch 語句捕獲。注意:因此無法知道錯誤是哪個Promise產生的,除非設置了不一樣的錯誤提示。
一般,不要在 then 方法中定義 Rejected 狀態的回調函數(即 then 的第二個參數),而應該總是使用 catch。
如果沒有使用 catch 方法指定錯誤處理的回調函數,Promise 對象拋出的錯誤不會傳遞到外層代碼,即不會有任何反應。
catch 方法返回的還是一個 Promise 對象,因此還可以接着調用 then 方法。
如果沒有報錯,則會跳過 catch 方法,繼續執行后面的 then 方法(如果后面還有 then 方法的話)。
getJson ('/post/1.json').then ( function (post) {
return getJson(post.commentURL)
}).then ( function (comments) {
// some code
}).catch ( function (error) {
// 處理前面3個 Promise 產生的錯誤
})
var p = Promise.all([p1, p2, p3])
p的狀態有 p1、p2、p3 決定,分成2種情況:
1. 只有 p1、p2、p3 的狀態都變成 Fulfilled,p 的狀態才會變成 Fulfilled,此時 p1、p2、p3 的返回值組成一個數組,傳遞給 p 的回調函數。
2. 只要 p1、p2、p3 中有一個被 Rejected,p 的狀態就變成 Rejected,此時第一個被 Rejected 的實例的返回值會傳遞給 p 的回調函數。