使用Q進行同步的Promises操做

  如何經過使用Q來併發執行多個promises呢?數組

Q(Q(1), Q(2), Q(3))
    .then(function (one, two, three) { 
        console.log(one);
        console.log(two);
        console.log(three);
    }, function (ex) {
        console.error(ex.stack);
    });
// 1

  上面的代碼輸出結果爲1。很顯然,你不能簡單地將各個promises都放到一個Q()函數裏來執行,這樣只有第一個promise會被正確地執行,剩餘的都會被忽略掉。promise

  你能夠使用Q.all來代替上面的方法,它們之間的主要區別是前者將每一個promise單獨做爲參數進行傳遞,而Q.all則接收一個數組,全部要並行處理的promise都放到數組中,而數組被做爲一個獨立的參數傳入。併發

Q.all([Q(1), Q(2), Q(3)])
    .then(function (one, two, three) {
        console.log(one);
        console.log(two);
        console.log(three);
    }, function (ex) {
        console.error(ex.stack);
    });
// [1,2,3]

  上面的代碼輸出結果爲[1, 2, 3]。全部的promises都被正確執行,可是你發現Q.all返回的結果依然是一個數組。咱們也能夠經過下面這種方式來獲取promises的返回值:函數

Q.all([Q(1), Q(2), Q(3)])
    .then(function (one, two, three) {
        console.log(one[0]);
        console.log(one[1]);
        console.log(one[2]);
    }, function (ex) {
        console.error(ex.stack);
    });
// 1
// 2
// 3

  除此以外,咱們還能夠將then替換成spread,讓Q返回一個個獨立的值而非數組。和返回數組結果的方式相同,這種方式返回結果的順序和傳入的數組中的promise的順序也是一致的。spa

Q.all([Q(1), Q(2), Q(3)])
    .spread(function (one, two, three) {
        console.log(one);
        console.log(two);
        console.log(three);
    }, function (ex) {
        console.error(ex.stack);
    });
// 1
// 2
// 3

  那若是其中的一個或多個promsie執行失敗,被rejected或者throw error,咱們如何處理錯誤呢?code

Q.all([Q(1), Q.reject('rejected!'), Q.reject('fail!')])
    .spread(function (one, two, three) {
        console.log(one);
        console.log(two);
        console.log(three);
    }, function (reason, otherReason) {
        console.log(reason);
        console.log(otherReason);
    });
// rejected!
// undefined

  若是傳入的promises中有一個被rejected了,它會當即返回一個rejected,而其它未完成的promises不會再繼續執行。若是你想等待全部的promises都執行完後再肯定返回結果,你應當使用allSettledblog

Q.allSettled([Q(1), Q.reject('rejected!'), Q.reject('fail!')])
.then(function (results) {
    results.forEach(function (result) {
        if (result.state === "fulfilled") {
            console.log(result.value);
        } else {
            console.log(result.reason);
        }
    });
});
// 1
// rejected!
// fail!
相關文章
相關標籤/搜索