2017-10-05 1 views
0

MySQL 데이터베이스가있는 NodeJS를 처음 사용하고 중첩 쿼리 용 코드를 실행하고 싶습니다. 시나리오는 불완전한 거래 목록을 가져온 다음 반복적 인 루프를 사용하여 데이터베이스에서받은 목록을 반복해야한다는 것입니다. 루프에서 더 많은 쿼리를 실행하고 타사 API를 호출하여 콜백에서 데이터를 반환하는 데이터를 가져옵니다. 이제 문제는 콜백이 비동기 적으로 실행되고 루프가 데이터를 반환하기 위해 콜백을 기다리지 않고 계속 이동한다는 것입니다. 이 상황에서 내가 꼼짝 못하게 될 때 친절하게 안내하겠습니다.중첩 쿼리 처리 NodeJS의 MySQL 콜백

여기 NodeJS 근본적으로, 당신의 중첩 된 쿼리를 비동기 될 것입니다 비동기 자연에서 작동하며 콜백 체인을 작성하는 고통스러운 작업이 될 것이다, 내 코드 이후

var sql = incompleteTradesQuery.getIncompleteTrades(); 
    sqlConn.query(sql, function (err, data) { 
     if (err) { 
      console.log(err); 
     } 
     else { 
      for (var i = 0; i < data.length; i++) { 
       bittrexExchange.getOrder(data.order_uuid, function(err, order_data) { 
       if (order_data.result.IsOpen != true) { 
       var order_sql = tradesQuery.insertTrade(order_data.result.OrderUuid, order_data.result.Exchange, data.customer_id, order_data.result.Quantity, order_data.result.QuantityRemaining, order_data.result.Limit, order_data.result.Reserved, order_data.result.ReserveRemaining, order_data.result.CommissionReserved, order_data.result.CommissionReserveRemaining, order_data.result.CommissionPaid, order_data.result.Price, order_data.result.PricePerUnit, order_data.result.Opened, order_data.result.Closed, order_data.result.IsOpen, null, data.commission_fee, data.total_transfer, new Date()); 
       sqlConn.query(order_sql); 

       var incomplete_trades_query = incompleteTradesQuery.deleteIncompleteTradesById(data.id); 
       sqlConn(incomplete_trades_query); 
      } 
      }); 
      } 
     } 
    }); 
+1

가능한 복제 [자바 스크립트 클로저 내부 루프 - 간단한 실제적인 예 (https://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

답변

2

입니다. 귀하의 질문에 대한 간단한 대답은 use promises입니다.

또한 비동기 방식으로 여러 쿼리를 처리하는 것이 좋습니다. 쿼리/요청을 처리하는 동기식 방식보다 더 빨리 작동합니다.

NodeJS는 또한 문제를 해결하는 async.js 모듈을 제공합니다. QStep은 중첩 된 콜백 코드를 처리하는 데 유용한 패키지입니다. 의

https://code.tutsplus.com/tutorials/managing-the-asynchronous-nature-of-nodejs--net-36183

+0

수 내 코드에서 코드를 사용하는 방법에 대한 코드 스 니펫을 제공합니까? –