2015-02-09 117 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); 
});