then
then
函數能夠return
另外一個promise
:數組
const p1 = new Promise((resolve, reject) =>{
resolve('p1')
})
const p2 = new Promise((resolve, reject) =>{
setTimeout(() =>{
resolve('p2')
},3000)
})
p1.then(res => {
console.log(res)
return p2
}).then(res =>{
// p2 resolve後才執行
console.log(res)
})
//p1
// 3s後輸出...
// p2
複製代碼
那麼這個p2
就會代替當前p1
的狀態,等到新的p2
的狀態修改時,下一個then
纔會執行promise
catch
能夠捕獲到promise
程序執行中的error
,等同於 .then(null, rejection)
或 .then(undefined, rejection)
函數
promise
函數體中拋出的error
。在promise
resolve
後,再拋出錯誤,不會被捕獲const p1 = new Promise((resolve,reject) => {throw new Error('error')})
p1.catch(error => console.log(error)) // Error: error
複製代碼
promise
的reject
操做const p2 = new Promise((resolve,reject) => reject('rejected'))
p2.catch(error => console.log(error)) // rejected
複製代碼
then
函數體中拋出的error
const p3 = new Promise((resolve,reject) => resolve('resolved'))
p3.then(res =>{
throw new Error('error')
}).catch(error => console.log(error)) // Error: error
複製代碼
then
函數能夠返回一個promise
(若是沒有定義catch方法),若是這個promise
函數體中有reject
或者error
,也能夠捕獲到catch
方式捕獲錯誤,而不是then
的第二個參數:由於catch
能夠捕獲到它前面全部then
方法中的錯誤ui
finally
promise
最後狀態如何,都會執行的操做promise
最後的狀態Promise.all
Iterator
接口的對象均可以。promise
實例,若是不是,就會調用Promise.resolve
轉換爲Promise
實例const obj = {
[Symbol.iterator]() {
let index = 0
return {
next() {
return {
// promise對象 和 其餘類型均可以
value: new Promise(resolve => resolve(index++)), done: index > 2
// value: index++, done: index > 2
}
}
}
}
}
const p = Promise.all(obj)
p.then(res => {
console.log(res) // [0, 1]
})
複製代碼
const p = Promise.all([p1, p2, p3]);
複製代碼
p的狀態由p一、p二、p3決定,分紅兩種狀況:spa
p一、p二、p3
的狀態都變成fulfilled
,p的狀態纔會變成fulfilled
,此時p一、p二、p3的返回值組成一個數組,傳遞給p的回調函數。p一、p二、p3
之中有一個被rejected
,p的狀態就變成rejected
,此時第一個被reject
的實例的返回值,會傳遞給p的回調函數。catch
若是參數中的promise
定義了catch
方法,那麼Promise.all()
的catch
就不會捕獲到錯誤code
Promise.race
Promise
實例的返回值,就傳遞給p的回調函數。catch
規則同Promise.all
Promise.resolve
將現有對象轉爲
Promise
對象。對象
promise
實例:原封不動的返回這個實例。thenable
對象:將它轉爲promise
對象,而後當即執行它的then
方法thenable
對象,或者是一個原始值:返回一個新的promise
對象,狀態爲resolved
resolved
狀態的promise
對象返回一個狀態爲
rejected
的promise
實例接口
Promise.reject()
方法的參數,會原封不動地做爲reject的理由,變成後續方法的參數回調函數
const thenable = {
then(resolve, reject) {
reject('error');
}
};
Promise.reject(thenable)
.catch(e => {
console.log(e === thenable)
})
// true e並非'error'
複製代碼