對Promise中的resolve,reject,catch的理解


想必接觸過Node的人都知道,Node是以異步(Async)回調著稱的,其異步性提高了程序的執行效率,但同時也減少了程序的可讀性。如果我們有幾個異步操作,並且后一個操作需要前一個操作返回的數據才能執行,這樣按照Node的一般執行規律,要實現有序的異步操作,通常是一層加一層嵌套下去。

為了解決這個問題,ES6提出了Promise的實現...

一   Promise 對象的含義?

Promise 對象用於一個異步操作的最終完成(或失敗)及其結果值的表示。簡單點說,它就是用於處理異步操作的,異步處理成功了就執行成功的操作,異步處理失敗了就捕獲錯誤或者停止后續操作。

它的一般表示形式為:

 1 new Promise(
 2     /* executor */
 3     function(resolve, reject) {
 4         if (/* success */) {
 5             // ...執行代碼
 6             resolve();
 7         } else { /* fail */
 8             // ...執行代碼
 9             reject();
10         }
11     }
12 );
View Code

其中,Promise中的參數executor是一個執行器函數,它有兩個參數resolvereject。它內部通常有一些異步操作,如果異步操作成功,則可以調用resolve()來將該實例的狀態置為fulfilled,即已完成的,如果一旦失敗,可以調用reject()來將該實例的狀態置為rejected,即失敗的。

我們可以把Promise對象看成是一條工廠的流水線,對於流水線來說,從它的工作職能上看,它只有三種狀態,一個是初始狀態(剛開機的時候),一個是加工產品成功,一個是加工產品失敗(出現了某些故障)。同樣對於Promise對象來說,它也有三種狀態:

1.pending

初始狀態,也稱為未定狀態,就是初始化Promise時,調用executor執行器函數后的狀態。

2.fulfilled

完成狀態,意味着異步操作成功。

3.rejected

失敗狀態,意味着異步操作失敗。

二  .then()的時候到底是在then什么?

  • 首先要理解Promise是一個對象,有then()方法的對象
  • then()的參數是一個函數 (通常在promise鏈中,參數是一個返回promise的函數 ,這個函數會return一個promise對象)

三  如何破壞promise鏈?

如果有這樣一個promise鏈:

 1 p1().then(p2).then(p3)
 2   .then(function(data) {
 3     console.log('data: ' + data);
 4   })
 5   .catch(function(error) {
 6     console.log('error: ' + error);
 7   });
 8  
 9 function p1() {
10   return new Promise(function(resolve, reject) {
11     console.log('p1 resolved');
12     resolve(123);
13   });
14 }
15  
16 function p2() {
17   return new Promise(function(resolve, reject) {
18     console.log('p2 rejected');
19     reject(456);
20   });
21 }
22  
23 function p3() {
24   return new Promise(function(resolve, reject) {
25     console.log('p3 resolved');
26     resolve(789);
27   });
28 }
View Code

上面這個例子,console.log結果會是這樣:

1 p1 resolved
2 p2 rejected
3 error: 456
View Code

總之 : 在一個promise鏈中,只要任何一個promise被reject,promise鏈就被破壞了,reject之后的promise都不會再執行,而是直接調用.catch方法。

這也是為什么在standard practice中,一定要在最后加上 .catch 的原因。通過 .catch 能夠清楚的判斷出promise鏈在哪個環節出了問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM