大白話理解promise對象

Promise  表明了將來某個將要發生的事件(一般是一個異步操做) 

 


Promise 是異步編程的解決方案,可以簡化多層回調嵌套,表明了將來某個將要發生的事件。
Promise是一個構造函數,自己有all、reject、resolve,原型上有then、catch。故Promise new出來的對象確定就有then、catch。ajax

promise接收的參數是一個匿名函數,匿名函數也有二個參數resolve/reject。
resolve表示異步操做執行成功後的回調函數,並將異步操做的結果,做爲參數傳遞出去;
b. reject表示異步操做執行失敗後的回調函數,並將異步操做的問題,做爲參數傳遞出去;
promise有三種狀態:pending(等待態),fulfiled(成功態),rejected(失敗態);狀態一旦改變,就不會再變。編程

* 創造promise實例後,會當即執行通常是包在一個函數中,在須要的時去運行這個函數,包裝好的函數最後,會returnPromise對象 

 1)then方法進行鏈式調用,then 方法必須返回一個新的 promise 對象

then方法能夠接受兩個回調函數做爲參數。第一個回調函數是Promise對象的狀態變爲resolved時調用,第二個回調函數是Promise對象的狀態變爲rejected時調用。其中,第二個函數是可選的,不必定要提供。這兩個函數都接受Promise對象傳出的值做爲參數。數組

2)catch方法在執行resolve的回調時,若是拋出異常了(代碼出錯了),那麼並不會報錯卡死js,而是會進到這個catch方法中。promise

let p = new Promise((resolve, reject) => {
    console.log('====')
    //作一些異步操做
    setTimeout(function(){
        var num = Math.ceil(Math.random()*10); //生成1-10的隨機數
        if(num < 5 ){
            resolve(num);
        }
        else{
            reject('數字大於等於5');
        }
    }, 1000);
});
p.then((data) => {
        console.log('resolved',data);
        console.log(somedata);
    },(err) => {
        console.log('rejected',err);
    }
).catch((err) => {
    console.log('catch',err);
});

// 當即輸出=====

1s後根據num判斷輸出resolved 三、rejected 數字大於等於5dom

應用場景:異步

使用promise實現超時處理、封裝處理ajax請求  異步編程

2) Promise.all。提供了並行執行異步操做的能力,而且在全部異步操做執行完後才執行回調.函數

能夠將多個Promise實例包裝成一個新的Promise實例spa

同時,成功和失敗的返回值是不一樣的,成功的時候返回的是一個結果數組(數據順序和Promise.all接收到的數組順序是一致的,即p1的結果在前,即使p1的結果獲取的比p2要晚),而失敗的時候則返回最早被reject失敗狀態的值。code

應用場景:

Promse.all在處理多個異步處理時很是有用,好比說一個頁面上須要等兩個或多個ajax的數據回來之後才正常顯示,在此以前只顯示loading圖標。

一些遊戲類的素材比較多的應用,打開網頁時,預先加載須要用到的各類資源如圖片、flash以及各類靜態文件。全部的都加載完後,咱們再進行頁面的初始化。

3) Promise.race([p1, p2, p3])裏面哪一個結果得到的快,就返回那個結果,無論結果自己是成功狀態仍是失敗狀態。

應用場景:

能夠用race給某個異步請求設置超時時間,而且在超時後執行相應的操做

相關文章
相關標籤/搜索