2015-02-09 69 views
0

我想要一個接一個地執行一個微風查詢數組。在所有查詢完成執行後,我正在使用Q.all來執行操作。Q.all用於解析承諾數組

var promises = []; 
promises.push(datacontext.breezeQuery(config.breezeEntity.Product)); 
promises.push(datacontext.breezeQuery(config.breezeEntity.Client)); 

上面提到的breezeQuery函數返回多個承諾,我不希望第二個查詢執行,直到所有的第一次查詢的承諾得到解決。但是我發現在使用Q.all(promises)時,當查詢1的第一個promise被解析時,第二個查詢開始執行。

如何確保第二個查詢在第一個查詢中的所有承諾(Promise1和Promise2)都解決之前不會開始執行。

dc.breezeQuery = function(entity){ 
    return Promise1().then(function(){ 
    return Promise2().then(function(){ 
    }); 
    }); 
}; 
+0

你是什麼意思「回報多重承諾」? – Bergi 2015-02-09 22:29:51

+0

正如你在上面的dc.breezeQuery函數中看到的那樣,有2個return語句,並且它們都返回promise。 – user2585299 2015-02-10 14:34:34

+0

不可以。「breezeQuery」函數中只有一個'return'語句。另一個'return'語句在該回調函數中。每個只會返回一個承諾。 – Bergi 2015-02-10 14:45:05

回答

3

聽起來就像你有一系列想要順序執行的查詢。

試試這個:

var queries = ...,  // an array of breeze EntityQuery objects 
    entityManager = ..., // a breeze EntityManager 
    promise = Q.resolve(); 

// chain the queries together. 
queries.forEach(function(query) { 
    promise = promise.then(function() { return entityManager.executeQuery(query); }); 
}); 

promise.then(function() { console.log('all queries executed!'); }); 
+0

使用'reduce'代替forEach'這樣的事情 – Bergi 2015-02-09 22:30:43

3

您應該能夠使用Q.all。像這樣的東西。

var promises = arrayOfQueries.map(function(q) { 
    return entityManager.executeQuery(q); 
}); 

return Q.all(promises).then(function() { 
    return entityManager.executeQuery(query2); 
});