2016-06-07 6 views
0

내가 외부 API에 대한 요청 후 내 데이터베이스에서 개체가 존재하고 부정적인 경우 그것을 저장 약속 함수를 구현하려 했어요. Q.all에서 전달 된 배열과 함께이 함수를 사용하고 모든 개체가 같은 시간에 저장된다는 것을 알기 때문에 매번 검사가 실패하고 중복 개체가 있습니다. Q.all에서 전달 된 약속을 순차적으로 실행하고 병렬로 실행하지 않는 방법은 무엇입니까? 이것은 코드입니다. finalCuts는 고객과의 참조가있는 객체의 배열입니다. [12, C2 14, C3 : C1 (14), 상기 finalCuts 배열 I는 예를 들어 필드 코드 일부 개체가 있다면순차적으로 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; 

그래서, 내 데이터베이스에서이 함수의 실행 후을 나는 것 두 고객이 코드 14를 사용합니다.

+0

체크 아웃 http://stackoverflow.com/questions/24586110/resolve-promises-one-after-another-ie-in-sequence –

답변

0

Q. 모든 약속이 순차적으로 실행되지는 않습니다. 당신이 순차적으로 실행하려면, 당신은 같이 그들을 대기해야

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

에서 func1은 FUNC2는 func3는, ...는 약속

0

이이 질문에 대한 답이 아니라 답을 반환 할 때 당신 문제. "사슬에서 할 일"을 원할 경우 q은 적합하지 않습니다. 이를 위해서는 RxJS 프레임 워크를 사용해야합니다. 자세한 내용은 여기

읽기 -> https://github.com/Reactive-Extensions/RxJS

0

할 수 있습니다 체인 통화는 Q 문서의 Sequences 절에 설명 된대로 :

var result = Q(null); 
finalCuts.forEach(function(currFinalCut) { 
    result = result.then(function(){ 
     return checkAndSetCustomer(currFinalCut._id,currFinalCut.customerCod,customers); 
    }); 
});