【问题标题】:Q.all for resolving array of promisesQ.all 用于解决一系列承诺
【发布时间】:2015-04-09 09:49:42
【问题描述】:

我想一个接一个地执行一系列微风查询。在所有查询完成执行后,我正在使用 Q.all 执行操作。

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

上面提到的微风查询函数返回多个承诺,我不希望第二个查询执行,直到第一个查询的所有承诺都得到解决。但我发现在使用 Q.all(promises) 时,第二个查询会在查询 1 的第一个承诺得到解决时开始执行。

如何确保在第一个查询的所有承诺(Promise1 和 Promise2)都得到解决之前,第二个查询不会开始执行。

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

【问题讨论】:

  • “返回多个承诺”是什么意思?
  • 正如您在上面的 dc.breezeQuery 函数中看到的那样,有 2 个 return 语句,它们都在返回 Promise。
  • 没有。 breezeQuery 函数中只有一个 return 语句。另一个return 语句在该回调函数中。每个只返回一个承诺。

标签: javascript promise breeze q


【解决方案1】:

听起来您有一系列要按顺序执行的查询。

试试这个:

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!'); });

【讨论】:

  • 使用reduce 而不是forEach 来处理这样的事情
【解决方案2】:

您应该可以使用 Q.all。像这样的。

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

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

【讨论】:

    猜你喜欢
    • 2015-06-23
    • 2018-03-18
    • 2016-09-02
    • 2016-03-04
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2013-04-25
    • 2017-08-11
    相关资源
    最近更新 更多