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.

Как я могу гарантировать, что второй запрос не начнет свое выполнение, пока не будут разрешены все промисы (Promise1 и Promise2) из ​​первого запроса.

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

person user2585299    schedule 09.02.2015    source источник
comment
Что вы подразумеваете под возвратом нескольких промисов?   -  person Bergi    schedule 10.02.2015
comment
Как вы можете видеть в приведенной выше функции dc.breezeQuery, есть 2 оператора возврата, и оба они возвращают промисы.   -  person user2585299    schedule 10.02.2015
comment
Нет. В функции breezeQuery есть только один оператор return. Другой оператор return находится в этой функции обратного вызова. Каждый возвращает только одно обещание.   -  person Bergi    schedule 10.02.2015


Ответы (2)


Похоже, у вас есть массив запросов, которые вы хотите выполнять последовательно.

попробуй это:

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!'); });
person Jeremy Danyow    schedule 09.02.2015
comment
Используйте reduce вместо forEach для такой вещи - person Bergi; 10.02.2015

Вы должны иметь возможность использовать Q.all. Что-то вроде этого.

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

return Q.all(promises).then(function() {
  return entityManager.executeQuery(query2);
});
person Jay Traband    schedule 09.02.2015