想必接觸過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 );
其中,Promise中的參數executor
是一個執行器函數,它有兩個參數resolve
和reject
。它內部通常有一些異步操作,如果異步操作成功,則可以調用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 }
上面這個例子,console.log結果會是這樣:

1 p1 resolved 2 p2 rejected 3 error: 456
總之 : 在一個promise鏈中,只要任何一個promise被reject,promise鏈就被破壞了,reject之后的promise都不會再執行,而是直接調用.catch方法。
這也是為什么在standard practice中,一定要在最后加上 .catch
的原因。通過 .catch
能夠清楚的判斷出promise鏈在哪個環節出了問題。