2017-03-14 157 views
0

我正在使用Kriskowal Q library來處理承諾。解決與Q.all同步的承諾(承諾)

我寫了下面的函數,等到所有的promise都解決了。

function multiplePromises(targetArray) { 
    var promises = {}; 
    for (var i=0; i<targetArray.length; i++) { 
     var promise = singlePromise(); // any async. function 
     promises[i] = promise; 
    }; 
    return Q.all(promises); 
}; 

和我稱之爲如下:(?例如是同步的)

multiplePromises(targetArray).then(
    function(success){ 
     console.log("success"); 
    }, 
    function(error){ 
     console.log("error", error); 
    } 
); 

我想知道然而是否存在其中的承諾被解析的順序。即該功能是否等待觸發下一個承諾i+1,直到承諾i得到解決?或者,它與其他所有異步一樣。方法,它實際上觸發了所有單一的承諾,只是等到它們全部完成了?

如果第二種情況下,如何重寫此函數以確保承諾i+1只有在承諾i已解決時纔會觸發?

更新:測試

我做了一個測試,把:

promises[i] = i; 

,以檢查它是否解決sycnhronously,它似乎如此。但是,這可能只是我的異步函數足夠快而能夠快速地解決它。這看起來正確嗎?

+0

什麼sycnhronously'我想你的意思'serially' - 因爲有絕對沒有同步關於承諾 –

+0

清除。任何想法如何使它「連續」? – JohnAndrews

+0

是的,很容易,如果我只知道'Promise.resolve()'Q'相當於'' –

回答

1

有幾種方法可以達到你想要

你的代碼最小的變化將是

function multiplePromises(targetArray) { 
    var promises = []; 
    var p = Promise.resolve(); // I don't know the Q equivalent of this 
    for (var i=0; i<targetArray.length; i++) { 
     p = p.then(function() { 
      return singlePromise(); 
     }); 
     promises[i] = p; 
    }; 
    return Q.all(promises); 
}; 
你寫的每`時間
+0

太棒了! 'promises [i] = promise'中的承諾是什麼?它應該是'p'嗎? – JohnAndrews

+0

對不起,這是正確的 –

0

承諾將由Q按您聲明的順序執行,但無法確保退貨訂單相同。這就是異步的工作原理。

如果你想讓他們按順序解決,我能想到的唯一方法就是一個接一個地調用他們,而不是一批一批的完成。

這等反應將提供更多的信息和一些解決方案: https://stackoverflow.com/a/36795097/7705625

0

承諾在理論上可以爲了解決(它可能是很容易寫一個例子中,他們會),但你不應該指望那。

的功能,如Promise.all()(或Q.all()Bluebird.all()等)的全部意義在於,如果對於所有承諾的等待得到解決,不管是什麼樣的,訂單,並儘快它們都解決了,然後Promise.all()本身返回的承諾可以用原始承諾解決的值數組解決。

在該數組中,您將始終獲得與作爲參數Promise.all()的參數中的承諾順序相同的順序。但是原始承諾已經解決的時間順序是未知的,並且不相關,因爲這對使用Promise.all()的結果沒有任何影響。

+0

是的,但在我的情況下,我真的需要解決它,因爲先前的承諾會影響下一個承諾。 – JohnAndrews