ES6 Promise對(duì)象

含義

是異步編程的一種解決方案。
類似于一個(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容