Promise掃盲貼
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: error
promise的reject操作
const p2 = new Promise((resolve,reject) => reject('rejected'))
p2.catch(error => console.log(error)) // rejected
then 函數(shù)體中拋出的error
const p3 = new Promise((resolve,reject) => resolve('resolved'))
p3.then(res =>{
throw new Error('error')
}).catch(error => console.log(error)) // Error: error
then函數(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實例,如果不是,就會調用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]
})
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的回調函數(shù)。
- 只要p1、p2、p3之中有一個被rejected,p的狀態(tài)就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調函數(shù)。
3. catch
如果參數(shù)中的promise定義了catch方法,那么Promise.all()的catch就不會捕獲到錯誤
Promise.race
- 只要p1、p2、p3之中有一個實例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個率先改變的 Promise 實例的返回值,就傳遞給p的回調函數(shù)。
- 參數(shù)、catch規(guī)則同Promise.all
Promise.resolve
將現(xiàn)有對象轉為Promise對象。
1. 參數(shù)
- 參數(shù)為promise實例:原封不動的返回這個實例。
- 參數(shù)為thenable對象:將它轉為promise對象,然后立即執(zhí)行它的then方法
- 參數(shù)不是thenable對象,或者是一個原始值:返回一個新的promise對象,狀態(tài)為resolved
- 沒有參數(shù):直接返回衣蛾resolved狀態(tài)的promise對象
Promise.reject
返回一個狀態(tài)為rejected的promise實例
Promise.reject()方法的參數(shù),會原封不動地作為reject的理由,變成后續(xù)方法的參數(shù)
const thenable = {
then(resolve, reject) {
reject('error');
}
};
Promise.reject(thenable)
.catch(e => {
console.log(e === thenable)
})
// true e并不是'error'
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解javascript立即執(zhí)行函數(shù)表達式IIFE
本文主要介紹了javascript立即執(zhí)行函數(shù)表達式IIFE的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02
javascript游戲開發(fā)之《三國志曹操傳》零部件開發(fā)(三)情景對話中仿打字機輸出文字
前兩講我告訴了大家如何使人物移動,那么今天我們就來看看如何實現(xiàn)仿《三國志曹操傳》人物情景對話,感興趣的朋友可以了解下,希望本文對你有所幫助2013-01-01

