2016-06-07 2 views
0

Я попытался реализовать функцию обещания, которая после запроса внешнего api проверяет в моей базе данных, если объект существует и в отрицательном случае он сохраняет его. Я использую эту функцию с массивом, переданным в Q.all, и я вижу, что все объекты сохраняются в одно и то же время, поэтому проверка прерывается каждый раз, и у меня есть повторяющиеся объекты. Как я могу выполнить обещания, переданные в Q.all последовательно, а не параллельно? Это код: finalCuts - это массив объектов, имеющих ссылку на клиентов.Последовательно Q.all обещает nodejs

request.findNewCustomer().then(function(customers) { 
    Q.all(finalCuts.map(function(currFinalCut) { 
     return checkAndSetCustomer(currFinalCut._id,currFinalCut.customerCod,customers) 
    })); 
}); 

checkAndSetCustomer = function(cutId,cod,customers) { 
    var deferred = Q.defer(); 
    Customer.findByIdentity(cod).then(function(customer) { 
     if (customer && customer.cod == cod) { 
       Cut.addCustomerToCut(customer._id,cutId).then(function(result) { 
       deferred.resolve(result); 
      }); 
     } else { 
      customers.forEach(function(currCustomer) { 
       if (currCustomer.cod == cod) { 
Customer.saveNewCustomer(currCustomer).then(function (customer) { 
     Cut.addCustomerToCut(customer._id, cutId).then(function (cut) { 
          deferred.resolve(cut); 
         }) 
        }) 
       } 
return deferred.promise; 

Таким образом, если в массиве finalCuts У меня есть объект с кодом поля, например [c1: 12, в2: 14, с3: 14], после выполнения этой функции в моей базе данных у меня будет два клиента с кодом 14.

+0

Заканчивать http://stackoverflow.com/questions/24586110/Разрешая-обещания-один-после-другому-то-в-последовательности –

ответ

0

Q.all выполняет все обещания сразу, а не последовательно. Если вы хотите запускать их последовательно, вы должны ставить их в очередь как:

func1().then(function() { 
    ... 
    return func2(); 
}).then(function() { 
    ... 
    return func3(); 
}) 
... etc 

когда func1, func2, FUNC3 ... возвращает обещания

0

Это не ответ на этот вопрос, но ответ для вашей проблемы. Если вы хотите «делать что-то в цепочке», то q не подходит для этого. Для этого вы должны использовать RxJS framework.

Подробнее здесь -> https://github.com/Reactive-Extensions/RxJS

0

Вы можете цепи вызовы, как описано в разделе Sequences документации Q:

var result = Q(null); 
finalCuts.forEach(function(currFinalCut) { 
    result = result.then(function(){ 
     return checkAndSetCustomer(currFinalCut._id,currFinalCut.customerCod,customers); 
    }); 
}); 
Смежные вопросы