ES6 Promise

當咱們使用ajax時,異步回調,當請求過多時,很容易造成回調地域。使咱們很難維護,不易拓展功能和管理。在jQuery中實現裏管理異步回調deferred,一樣,ES6原生的js也提供了管理異步回調的方法。使其能線性的拓展,方便咱們管理和維護。ajax

Promise是ES6內置的構造函數,使用時要使用new建立一個promise對象。接收一個函數做爲參數。這個函數裏面的代碼是同步執行的。數組

promise有三個狀態,pending:初始狀態。fulfilled 成功狀態 。rejected 失敗狀態。promise

當在傳入的函數裏執行某些操做時,咱們能夠觸發他的成功,或失敗狀態。成功執行某些操做。失敗執行某些操做。這些操做在then方法裏面承諾。dom

then 方法傳入兩個參數函數,分別對應着成功的回調函數和失敗的回調函數。而且在then中註冊的函數是異步執行的,及會放在任務隊列中,等主任務執行完畢在執行,可是會陷入settimeout,setInterval等異步任務,(任務隊列的任務分爲主任務和微任務,微任務會先入主任務執行)。  所以下方的代碼執行時0 2 1。異步

then方法返回一個新的promise對象。這提供了鏈式調用,是異步任務能夠線性的方式書寫。函數

 

     let oP = new Promise((resolve,reject)=>{
            //setTimeout(() => { // Math.random() * 100 > 60 ? resolve('ok') : reject('no'); i // }, 1000);
            console.log(0);
            resolve(1);
            console.log(2);
        }) 

     oP.then((val)=>{ console.log(val); return new Promise((res,rej)=>{ rej(2); }); }).then(function(val){ console.log(val); },function(reason){ console.log(reason); })

 

 

then的鏈式調用。當觸發第一個then的成功函數(第一個函數沒有拋出錯誤)後會調用第二個then的成功函數。而且return的返回值會做爲第二個回調函數的參數。spa

     let oP = new Promise((resolve,reject)=>{
            resolve(1);
        })    
       
        oP.then((val)=>{
            console.log('ok' + val);
         //throw new Error('error');
       return val;
        },function(reason){
            console.log('no' + reason);
       return val; }).then(function(val){ console.log('ok' + val); },function(reason){ console.log('no' + reason); })

    // 1 OK
// 1 OK

 

當觸發第一個函數拋出錯誤時,會調用第二個then函數的失敗函數,捕獲錯誤。code

在兩個then之間存在空then時,會直接忽視,仍然會獲取到上一個函數的參數。對象

 

promise.all([]),參數接收一個promise對象數組,當全部promise對象都成功就返回一個結果數組,當有一個失敗,就調用失敗函數,返回最早被reject失敗狀態的值,執行後返回一個新的promise實例。blog

    function text(x){
            return new Promise((res,rej)=>{
                setTimeout(() => {
                    Math.random() * 100 > 50 ? res(x) : rej(x);             
                }, 100);
            })
        }

        let oP = Promise.all([text(),text(),text()]);
        oP.then(function(val){
            console.log(val);
        },(reason)=>{
            console.log(reason);
        })

 

promise.race([]),參數接收一個promise數組,當那個promise對象結果或得的快,就返回那個最快的結果。

     let oP = Promise.race([text('a'),text('b'),text('c')]);
        oP.then(function(val){
            console.log(val);
        },(reason)=>{
            console.log(reason);
        })
相關文章
相關標籤/搜索