Promise分離異步執行代碼和處理結果代碼

     javascript的單線程處理總是讓人頭疼不已,異步執行的方法總要使用回調方法來處理它的反饋結果。一層套一層的傳參往往會使你的代碼變得一團糟……如何優雅的處理異步執行方法的代碼?

    Promise是一個不錯的解決方式!

    什麼是Promise

    它是javascript標準庫解決處理異步方法狀態,返回值的構造函數。

    定義方式:var pro = new Promise(function(resolve,reject){ ##方法體}),當然你也可以將方法定義到構造函數外面。

    參數: resolve 和 reject  爲成功和失敗調用的方法,你可以在方法中成功後調用resolve失敗後調用reject而不用關心這兩個方法是如何處理的。

    方法

Promise.prototype.then() AND Promise.prototype.catch()

.then()方法使Promise原型鏈上的方法,它包含兩個參數方法,分別是已成功resolved的回調和已失敗rejected的回調

promise.then(
     console.log('this is success callback')
)

.catch()的作用是捕獲Promise的錯誤,與then()的rejected回調作用幾乎一致。但是由於Promise的拋錯具有冒泡性質,能夠不斷傳遞,這樣就能夠在下一個catch()中統一處理這些錯誤。同時catch()也能夠捕獲then()中拋出的錯誤,所以建議不要使用then()的rejected回調,而是統一使用catch()來處理錯誤

promise.then(
    () => { console.log('this is success callback') }
).catch(
    (err) => { console.log(err) }
)

同樣,catch()中也可以拋出錯誤,由於拋出的錯誤會在下一個catch中被捕獲處理,因此可以再添加catch()

Promise.all(iterable)

        這個方法返回一個新的promise對象,該promise對象在iterable參數對象裏所有promise對象都成功的時候纔會觸發成功,一旦有任何一個iterable裏面的promise對象失敗則立即觸發該promise對象的失敗。這個新的promise對象在觸發成功狀態以後,會把一個包含iterable裏所有promise返回值的數組作爲成功回調的返回值,順序跟iterable的順序保持一致;如果這個新的promise對象觸發了失敗狀態,它會把iterable裏第一個觸發失敗的promise對象的錯誤信息作爲它的失敗錯誤信息。Promise.all方法常被用於處理多個promise對象的狀態集合。

var p1 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 600, 'P2');
});
// 同時執行p1和p2,並在它們都完成後執行then:
Promise.all([p1, p2]).then(function (results) {
    console.log(results); // 獲得一個Array: ['P1', 'P2']
});

Promise.race(iterable)

        當iterable參數裏的任意一個子promise被成功或失敗後,父promise馬上也會用子promise的成功返回值或失敗詳情作爲參數調用父promise綁定的相應句柄,並返回該promise對象。

p1.then(function (result) {
    console.log('成功:' + result);
});

Promise.reject(reason)

        返回一個狀態爲失敗的Promise對象,並將給定的失敗信息傳遞給對應的處理方法

Promise.resolve(reason)

        返回一個狀態由給定value決定的Promise對象。如果該值是一個Promise對象,則直接返回該對象;如果該值是thenable(即,帶有then方法的對象),返回的Promise對象的最終狀態由then方法執行決定;否則的話(該value爲空,基本類型或者不帶then方法的對象),返回的Promise對象狀態爲fulfilled,並且將該value傳遞給對應的then方法。通常而言,如果你不知道一個值是否是Promise對象,使用Promise.resolve(value) 來返回一個Promise對象,這樣就能將該value以Promise對象形式使用。
function test(resolve, reject) {
    var timeOut = Math.random() * 2;
    log('set timeout to: ' + timeOut + ' seconds.');
    setTimeout(function () {
        if (timeOut < 1) {
            log('call resolve()...');
            resolve('200 OK');
        }
        else {
            log('call reject()...');
            reject('timeout in ' + timeOut + ' seconds.');
        }
    }, timeOut * 1000);
}


                                                                           

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章