then
then函數(shù)可以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后才執(zhí)行 console.log(res)})//p1// 3s后輸出...// p2那么這個p2就會代替當前p1的狀態(tài),等到新的p2的狀態(tài)修改時,下一個then才會執(zhí)行
catch
1. 作用
可以捕獲到promise程序執(zhí)行中的error,等同于 .then(null, rejection) 或 .then(undefined, rejection)
2. 可以獲取到的錯誤
promise函數(shù)體中拋出的error。在promise resolve后,再拋出錯誤,不會被捕獲
const p1 = new Promise((resolve,reject) => {throw new Error('error')})p1.catch(error => console.log(error)) // Error: errorpromise的reject操作
const p2 = new Promise((resolve,reject) => reject('rejected'))p2.catch(error => console.log(error)) // rejectedthen 函數(shù)體中拋出的error
const p3 = new Promise((resolve,reject) => resolve('resolved'))p3.then(res =>{ throw new Error('error')}).catch(error => console.log(error)) // Error: errorthen函數(shù)可以返回一個promise(如果沒有定義catch方法),如果這個promise函數(shù)體中有reject或者error,也可以捕獲到
3. 推薦使用catch方式捕獲錯誤,而不是then的第二個參數(shù):
因為catch可以捕獲到它前面所有then方法中的錯誤
finally
不管promise最后狀態(tài)如何,都會執(zhí)行的操作 沒有參數(shù),獲取不到當前promise最后的狀態(tài)Promise.all
1. 參數(shù)
參數(shù)不僅僅可以是數(shù)組,具有Iterator接口的對象都可以。
數(shù)組參數(shù)的每一個元素為promise實例,如果不是,就會調(diào)用Promise.resolve轉(zhuǎn)換為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]}) 2. 狀態(tài)
const p = Promise.all([p1, p2, p3]);
p的狀態(tài)由p1、p2、p3決定,分成兩種情況:
只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會變成fulfilled,此時p1、p2、p3的返回值組成一個數(shù)組,傳遞給p的回調(diào)函數(shù)。 只要p1、p2、p3之中有一個被rejected,p的狀態(tài)就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調(diào)函數(shù)。3. catch
新聞熱點
疑難解答
圖片精選