2014-12-18 3 views
0

장바구니 작성 프로세스에 유효성 검사 기능을 추가하고 싶습니다. 이 검증 함수 배열을 수신하고, 각각의 반복에 대해, ... 데이터베이스 일부 값 거기NodeJS의 forEach 내부에서 비동기 작업이 제대로 수행됨

코드

async.map(eventPricings, function(priceItem, done) { 
    var eventPricing = new EventPricing(priceItem); 
    eventPricing.find(false, function(err, eventPricingFound) { 
     if(err) { 
      result.success = false; 
      result.errors.push("The EventPricing identifier : '"+eventPricing.id+"' does not exist"); 
     } else { 
      if(priceItem.quantity > eventPricingFound.quantityPerUser) { 
       result.success = false; 
       result.errors.push("Quantity exceed per user for eventPricing identifier "+eventPricing.id); 
      } 
      else result.pendingTickets.push({quantity:priceItem.quantity, eventPricingId:eventPricingFound.id, price:eventPricingFound.price}); 
     } 
     i++; 
     if(i == eventPricingsCount) done(result); 
    }); 
}, function(resultArray) { /* Some stuff here */ }); 

find 방법은 서버 측과 자원을 가져올 비동기 함수를 확인할 수있다. 이 함수의 콜백에서 필자는 테스트를 진행하고 테스트가 통과하면 배열에 내 이벤트 가격을 추가합니다 ...

이 코드 부분을 검토하고 싶습니다. 특히 제거를 원합니다 프로세스를 차단 해제 할 수있는 마지막 줄은

i++; 
if(i == eventPricingsCount) done(result); 

아이디어가 있으십니까?

나는 현재 다른 기능에 Q를 사용하고있어,하지만 난이 특정 사건에 대한

덕분에 많은

답변

0

죄송합니다. 해결 모든 약속을 기다리는처럼, Q의 librairy과 Q.all() 메소드를 사용하여, 다음

eventPricingsValidationService.isEventPricingValid = function(eventPricing, options) { 

return models.eventPricing.find({where: {id: eventPricing.id}, {lang:options.lang}) 
    .then(function(ep) { 

     if (!ep) throw BEV.errorHandler({codeHttp: 404 , type: 'invalidEventPricing'}); 

     var quantity = ep.pendings.length; 

     if (quantity > ep.quantityPerUser) { 
      throw ("Quantity exceed per user for eventPricing identifier " + eventPricing.id); 
     } 

     return ep; 

    }).catch(function(error) { 
     throw BEV.errorHandler(error); 
    }); 
}); 

: 내가 약속을 반환하는 함수의 코드를 외부화 된 한 적이

계속하기 전에 :

_.forEach(eventPricings, function(eventPricing) { 
     promises.push(_this.isEventPricingValid({id:eventPricing.id}, options)); 
    }); 

Q.all(promises) 
    .then(function (results) { 
     // Some code here 
    }); 
0

을 할 수있는 어떻게 비동기 모듈인가요 몰라? 당신이 비동기를 올바르게 사용하고있는 것처럼 보이지 않습니다. 당신은 자신의 반복자를 유지할 필요가 없으며 매번 어딘가에서 호출해야합니다. 그렇지 않으면 결과 배열을 얻을 수 없습니다. 콜백은 또한 function(err, result)을 기대합니다. 에 관계없이, 당신이 원하는 않는 모듈이있다 : 비 답변

async-q

+0

답장을 보내고 미안합니다. 내 대답을 업데이트하고 해결 된 것으로 표시했습니다. 그렇게하는 효과적인 방법이라고 생각하십니까? – Chilipote