ECMAScript6--15.Promise用法

1.Promise(解決異步操作問題的)

  • 什么是異步
    比如:函數a,執行一個步驟,a執行完要執行b;有一個順序問題;
    在程序上設置a執行完執行b,一種通過回調方式,一種通過事件觸發方式;
  • Promise的作用
  • Promise的基本用法

2.模擬ajax的過程

{
  //ES5中回調解決異步操作的問題;
  //前端和服務端通信有一個ajax的過程;     
  let ajax =function(callback){
  
    console.log('執行');
    setTimeout(function(){
        //判斷這個回調是不是存在,如果存在就執行下一步;
        callback && callback.call();
    },1000);
    
  };
  
  //使用:調用這個方法,傳一個回調函數;
  ajax(function(){
    console.log('timeout1');
  });
  
  //輸出結果:先輸出了 執行(這個是ajax這個函數這個步驟執行的)
    一秒鐘之后執行了回調函數,輸出了 timeout1;               
}

3.Promise--then方法

  • 如果這個過程變的復雜,先執行a在執行b,b完了之后在執行c,以此類推,用回調的方式去處理,這個代碼寫法將非常復雜;
  • 這個代碼的復雜影響了后期的維護;很難一眼看出來這個回調的順序問題,到底哪個在前哪個在后;
{
    let ajax = function(){
    
        console.log('執行2');
        //ajax這個函數運行完之后,返回一個對象,Promise實例,這個實例有了一個then方法,
     就執行下一步的功能;
        //怎么去執行呢?這里面有兩個參數resolve,reject;
        //resolve:要執行下一步操作;reject:要中斷當前的操作;
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                //一秒鐘之后執行下一步的步驟;
                resolve();
            },1000);
        });
    };
    
    //then這個參數這個函數體就是要執行的下一步;
    /*
     *   ajax().then(function(){
     *      //第一個function對應的resolve;
     *       console.log('Promise','timeout2');
     *   },function(){
     *       //第二個function對應的是reject;
     *   });
     */
    
    ajax().then(function(){
        //第一個function對應的resolve;
        console.log('Promise','timeout2');
    });
    
    //輸出結果:執行2  Promise timeout2
    
    
}

4.多步回調:

{
    let ajax =function(){
        console.log('執行3');
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve();
            },1000);
        });
    };
    
    ajax().then(function(){
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve();
            },2000);
        });
    }).then(function(){
        console.log('timeout3');
    });
    
    //執行3  timeout3
}

5.串行過程 a b c 在中間某一步出錯,怎么捕獲這個錯誤

  • Promise提供了一個catch方法,捕獲異常錯誤;
{
    let ajax = function(num){
        console.log('執行4');
        return new Promise(function(resolve,reject){
            if(num>5){
                resolve();
            }else{
                throw new Error('出錯了');
            }
        );
    };
    
    ajax(6).then(function(){
        console.log('log',6);
    }).catch(function(err){
       console.log('catch',err); 
    });
    //log 6
    
     ajax(3).then(function(){
        console.log('log',3);
    }).catch(function(err){
       console.log('catch',err); 
    });
    //catch Error:出錯了
}

6.Promise.all 和Promise.race
eg:1.所有圖片加載完在添加到頁面

{
    function loadImg(src){
    
        return new Promise((resolve,reject)=>{
        
            let img = document.createElement('img');
            img.src = src;
            img.onload=function(){
                resolve(img);
            };
            
            img.onerror=function(err){
                reject(err);
            };
        });
    }
    
    function showImgs(imgs){
        imgs.forEach(function(img){
            document.body.appendChild(img);
        });
    }
    
    //Promise.all:把多個Proimse實例當做一個Promise實例;
    //all下面一個數組,數組傳遞進來多個Promise實例;當所有promise實例狀態發生改變的時候;
    新的Promise實例才會跟著發生變化;
    (下面這三張圖片的狀態都完成之后,才會觸發Promise.all這個新的Promise對象,所以這個
    Promise對象才會有then方法;
    Promise.all方法返回的是一個Promise實例,所以才可以調用then方法;
    --loadImg本身是一個Promise實例,這個promise實例是做一個圖片加載的動作,把三個圖片加載
      的動作放在Primose.all這個函數里面,生成一個新的promise實例,當三張圖片都加載完之后,
      才會觸發顯示圖片的邏輯;
    Promise.all([
        loadImg('http://i4.buimg.com/567571/dflef0720bea6832.png'),
        loadImg('http://i4.buimg.com/567571/2b07ee25b08930ba.png'),
        loadImg('http://i2.muimg.com/567751/5eb8190d6b2a1c9c.png')
    
    ]).then(showImgs);
}

eg:2:場景:三張圖片位于三個不同的位置,頁面需要加載一張圖片,三張圖片不知道哪張返回的比較快;

  • 三張圖片有三個來源,加載出來一個就可以;(先到先得)
{
    //有一個圖片加載完就添加到頁面上;
    function loadImg(src){
    
        return new Promise((resolve,reject)=>{
        
            let img = document.createElement('img');
            img.src = src;
            img.onload=function(){
                resolve(img);
            };
            
            img.onerror=function(err){
                reject(err);
            };
        });
    }

    function showImgs(img){
        let p = document.createElement('p');
        p.appendChild(img);
        document.body.appendChild(p);
    }
    
    //多個實例中,有一個狀態先改變,最后這個race實例也會跟著改變,其他的就不在響應了;
     Promise.race([
        loadImg('http://i4.buimg.com/567571/dflef0720bea6832.png'),
        loadImg('http://i4.buimg.com/567571/2b07ee25b08930ba.png'),
        loadImg('http://i2.muimg.com/567751/5eb8190d6b2a1c9c.png')
    
    ]).then(showImgs);
    //只顯示了一個;


}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容