大白話講解Promise(一)一文 的學習+新領悟

學習地址: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);
});
相關文章
相關標籤/搜索