含義
是異步編程的一種解決方案。
類似于一個(gè)容器,保存著某個(gè)未來才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果。
特點(diǎn)
- 對(duì)象的狀態(tài)不受外界的影響。pending(進(jìn)行中)、fulfilled(已成功)、rejected(已失敗)。
只有異步操作的結(jié)果會(huì)影響對(duì)象的狀態(tài)。 - 一旦狀態(tài)改變就不會(huì)再變---比如拿到結(jié)果后(已成功),promis對(duì)象的狀態(tài)就為請(qǐng)求成功狀態(tài),不會(huì)再改變。
局限性
- Promise無法取消,內(nèi)部錯(cuò)誤無法反應(yīng)到外部,pending狀態(tài)無法獲取
用法
const promise = new Promise(function(resolve,reject){
if (/*請(qǐng)求成功條件*/) {
reselve(value);
} else {
reject(error);
}
});
promise.then(function(result){ // 第一個(gè)參數(shù)resolved時(shí)調(diào)用
console.log(result);
},function(error){ // 第二個(gè)參數(shù)rejected時(shí)調(diào)用
console.log(error);
})
Promise方法
1.Promise.prototype.then()
Promise實(shí)例有then方法,then方法第一個(gè)參數(shù)是resolved狀態(tài)的回調(diào),第二個(gè)是rejected狀態(tài)的回調(diào)。
then返回的的是一個(gè)新的promise實(shí)例,因此可以采用鏈?zhǔn)綄懛ā?/p>
promise.then(function(json){
return json.post;
}).then(function(post){
// ...
});
第一個(gè)回調(diào)函數(shù)完成以后,會(huì)將返回結(jié)果作為參數(shù),傳入第二個(gè)回調(diào)函數(shù)。如果前一個(gè)then返回的是一個(gè)新的promise,后一個(gè)then需要等新的promise狀態(tài)發(fā)生改變后才會(huì)執(zhí)行。
2.Promise.prototype.catch()
catch是.then(null,rejection)或者.then(undefined,rejection)的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。
如果先把狀態(tài)變?yōu)閞esolved然后再拋出錯(cuò)誤是無效的。
在鏈?zhǔn)秸{(diào)用then的時(shí)候,promise對(duì)象錯(cuò)誤會(huì)一直往后傳遞,直到最后一個(gè)catch。
建議:Promise對(duì)象后要跟catch()方法,處理promise的內(nèi)部錯(cuò)誤
如果一個(gè)錯(cuò)誤沒被捕獲,這就是uncatch error,如果在這個(gè)錯(cuò)誤后有.catch則可以獲取到這個(gè)錯(cuò)誤。
3.Promise.prototype.finally()
.finally()方法不管Promise對(duì)象最后的狀態(tài)如何,都會(huì)執(zhí)行操作。
4.Promise.all()
Promise.all()方法用于多個(gè)promise實(shí)例,包裝成一個(gè)新的Promise實(shí)例。
const p = Promise.all([p1, p2, p3]);
會(huì)觸發(fā)Promise.all的條件:
1.當(dāng)所有作為參數(shù)的promise都為resolved狀態(tài)
2.當(dāng)有一個(gè)promise為rejected狀態(tài)。
3.當(dāng)有一個(gè)promise為rejected狀態(tài),如果它自己有catch方法,Promise.all的catch方法是獲取不到這個(gè)promise的錯(cuò)誤的
5.Promise.race()
Promise.race()同樣是把多個(gè)Promise實(shí)例,包裝成一個(gè)新的Promise實(shí)例。
與Promise.all()類似,但是只要有一個(gè)參數(shù)promise為resolved狀態(tài),就會(huì)觸發(fā)Promise.all()的resolve()方法,最先改變狀態(tài)的實(shí)例的返回值,傳遞給Promise.race的回調(diào)函數(shù)。
如果一段時(shí)間內(nèi)沒有獲取到結(jié)果,Promise.race的狀態(tài)會(huì)變?yōu)閞eject,否則變?yōu)閞esolve。
6.Promise.allSettled()
Promise.allSettled()接收一組promise實(shí)例作為參數(shù),包裝成一個(gè)新的Promise對(duì)象,只有參數(shù)的promise都返回結(jié)果,不論是fulfilled還是rejected,包裝實(shí)例才會(huì)結(jié)束。
Promise.allSettled回調(diào)的參數(shù)是之前接收整個(gè)參數(shù)的結(jié)果。
const resolved = Promise.resolve(42);
const rejected = Promise.reject(-1);
const allSettledPromise = Promise.allSettled([resolved, rejected]);
allSettledPromise.then(function (results) {
console.log(results);
});
// [
// { status: 'fulfilled', value: 42 },
// { status: 'rejected', reason: -1 }
// ]
7.Promise.any()
Promise.any()接收一組promise實(shí)例為參數(shù)。只要有一個(gè)編程fulfilled狀態(tài),包裝實(shí)例就變成fulfilled狀態(tài);如果所有參數(shù)實(shí)例都變成rejected狀態(tài),包裝實(shí)例才會(huì)變成rejected狀態(tài)。
拋出錯(cuò)誤回調(diào)的參數(shù)也是錯(cuò)誤結(jié)果的數(shù)組
8.Promise.resolve()
將現(xiàn)有對(duì)象轉(zhuǎn)換為Promise對(duì)象
9.Promise.reject()
將現(xiàn)有對(duì)象轉(zhuǎn)換為Promise對(duì)象實(shí)例,該實(shí)例狀態(tài)為reject
Promise.reject()方法的參數(shù),會(huì)作為新對(duì)象實(shí)例reject的理由,變成后續(xù)方法的參數(shù)。
10.Promise.try()
包裝一下普通函數(shù),希望通過then控制流程,希望包裝之前的函數(shù)是同步,包裝之后也是同步,反之亦然。
const f = () => console.log('now');
Promise.try(f);
console.log('next');
// now
// next