學習地址:http://www.cnblogs.com/lvdabao/p/es6-promise-1.htmlhtml
最近寫了三篇Promise的文章。拿來一學,本身畫了好些筆記,分享一下。node
簡述一下es6中的要點:jquery
一、Promise是一個構造函數,本身身上有all、reject、resolve、then、catch。。。。。es6
Promise定義時,必須傳遞一個函數,不然報錯; chrome
該函數有兩個參數,這個參數也是函數,這兩個函數應該是內部生成並傳遞進去的。promise
var p = new Promise(function(resolve, reject){ //作一些異步操做 setTimeout(function(){ resolve('隨便什麼數據'); }, 2000); });
定義後,這個Promise會直接執行的。 這是我原來沒有意識到的。異步
二、p.then(resolvedFun,rejectedFun);函數
then方法也是返回一個新的Promise,並再也不是原來的Promise本身了。 以第一個函數resolvedFun爲例來講明,學習
resolvedFun=function(data){ //return "完成 "+data; 直接返回數據,也會被封裝出一個新的Promise實例來,以提供給下then調用。 //return new Promise(function(){}); 返回另外一個Promise 。 我測試這個new Promise是否和then返回後的Promise不是同一個。 }
測試代碼:測試
var p = new Promise(function(resolve, reject){ //作一些異步操做 setTimeout(function(){ console.log('執行完成'); resolve( "somedata"); }, 2000); }) thenP=p.then(function(data){ window.newP= new Promise(function(){}); return window.newP }) thenP===newP //顯示是false,代表內部會對then的參數函數的返回值進行包裝。
三、p.catch(catchFun);
文中提到,catchFun至關於代替then中的第二個參數:rejectedFun。這一點沒問題
但還說「若是拋出異常了(代碼出錯了),那麼並不會報錯卡死js,而是會進到這個catch方法中」
通過我在chrome,node,edge裏面測試結果,這個說法是不對的。若是代碼寫錯,好比變量未定義這種,是會報錯,而不是進入到catch中,看來仍是要try catch來捕獲代碼的異常。
----2016.12.14更正一下:catch只捕獲then中的異常,且cache的參數函數被傳入的reason是一個Error對象。
不知道我原來是怎麼測試的,我當時多是在Promise的構造函數中寫的異常,就覺得原做者寫的不對!
四、Promise.all([ 多個Promise對象 ]).then(function( resultList){});
這個記住結構就行了。
五、Promise.race([ 多個Promise對象 ]).then(function( firstResult){});
只返回第1個異步回來的結果。這個原來沒注意到過。
2016.12.6 補充:
通常狀況下咱們會使用 new Promise
來建立prmise對象,除此以外咱們也能夠使用 Promise.reslove
和 Promise.reject
來直接建立,例如 Promise.resolve(42)
能夠認爲是如下代碼的語法糖
new Promise((reslove)=>{ reslove(42); });