1.Promise 實(shí)例
定義一個(gè)Promise實(shí)例,接收一個(gè)函數(shù),函數(shù)中的兩個(gè)參數(shù)分別是resolve和reject。resolve是異步操作成功之后調(diào)用,reject是失敗之后調(diào)用。
const promise = new Promise(function(resolve, reject) {
});
注意:Promise 創(chuàng)建后就會(huì)立即執(zhí)行,狀態(tài)變?yōu)槭』蛘叱晒χ缶筒粫?huì)再改變了。
2.Promise.prototype.then()
Promise實(shí)例生成以后,會(huì)有一個(gè)then方法。(這個(gè)then方法是定義在原型對象Promise.prototype上的)。then方法的第一個(gè)參數(shù)是resolved狀態(tài)的回調(diào)函數(shù),第二個(gè)參數(shù)(可選)是rejected狀態(tài)的回調(diào)函數(shù)。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
then方法可以鏈?zhǔn)秸{(diào)用:前一個(gè)回調(diào)函數(shù),有可能返回的還是一個(gè)Promise對象(即有異步操作),這時(shí)后一個(gè)回調(diào)函數(shù),就會(huì)等待該P(yáng)romise對象的狀態(tài)發(fā)生變化,才會(huì)被調(diào)用。
const p = function(greeting) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(greeting)
}, 1000)
})
}
p("hello").then(value => {
console.log(value); //1s之后彈出hello
return p("world");
}).then(value => {
console.log(value); //再過1s彈出world
})
注意,如果某一個(gè)then執(zhí)行后狀態(tài)變?yōu)閞ejected,就不會(huì)繼續(xù)執(zhí)行then方法,而是執(zhí)行rejected回調(diào)函數(shù)。
3.Promise.prototype.catch()
如果不想使用then的第二個(gè)參數(shù)去處理錯(cuò)誤,可以使用catch。
p.then(value => {
// success
}).catch(error => {
// failure
});
4.Promise.prototype.finally()
finally方法用于指定不管 Promise 對象最后狀態(tài)如何,都會(huì)執(zhí)行的操作。(ES2018 引入標(biāo)準(zhǔn)的)
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
5.Promise.all()
Promise.all方法把多個(gè)實(shí)例包裝成一個(gè)新的 Promise 實(shí)例,當(dāng)幾個(gè)實(shí)例都是成功狀態(tài),則新實(shí)例p就是成功狀態(tài)。如果某一個(gè)是失敗狀態(tài),則新實(shí)例就是失敗狀態(tài)。
const p = Promise.all([p1, p2, p3]);
注意:如果某個(gè)參數(shù)不是promise實(shí)例,則會(huì)把它自動(dòng)轉(zhuǎn)換為promise實(shí)例。
6.Promise.race()
Promise.race()也是把多個(gè)實(shí)例包裝成一個(gè)新的實(shí)例,當(dāng)其中某一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個(gè)率先改變的 Promise 實(shí)例的返回值,就傳遞給p的回調(diào)函數(shù)。
const p = Promise.race([p1, p2, p3]);
注意:如果某個(gè)參數(shù)不是promise實(shí)例,也會(huì)把它自動(dòng)轉(zhuǎn)換為promise實(shí)例。
7.Promise.resolve()
將現(xiàn)有的對象轉(zhuǎn)換為Promise 對象,并且狀態(tài)為resolved。
Promise.resolve('foo')
// 等價(jià)于
new Promise(resolve => resolve('foo'))
注意: 參數(shù)是一個(gè)promise實(shí)例,會(huì)直接返回這個(gè)實(shí)例。
8.Promise.reject()
返回一個(gè)rejected狀態(tài)的Promise 對象。