2016-08-25 2 views
-4

Node.js에서 "콜백 지옥"상황이 발생합니다.Node.js의 콜백 hell

가 기본적으로 내가 원하는 것은 (로컬) 정적 JSON 파일에서

데이터 읽기 -> 쿼리 MongoDB를 두 개의 별도의 컬렉션에서 두 개의 레코드를 얻을 수 -> 반환 된 데이터를 비교 -> 후 결과를 추가 결과 객체로 비교 -> 루프의 다음 단계로 이동 -> 반복

코드를 검토하여 문제가있는 부분을 알려주십시오.

jsonfile.readFile(file, function(err, staticData) { 
if(err){ 
    console.log("Error while loading Tower Details from Static Data " + err); 
} 
else{ 
    var staticD = staticData.Teams; 
    var l = staticData.Teams.length; 
// console.log('*******************Getting Tower Level Data from Static File*******************'); 
    //console.log('*******************Tower Name received is ******************* ' + staticData.Tower); 
     if(counter == l){ 
     console.log('Inside the couneter loop'); 
     res.json(testObject); 
     } 
    for (var i = 0 ; i<l; i++){ 
    var trackName = staticD[i].name 
    console.log('Counter--------->>>>' + counter); 
    //console.log("Team name " + staticD[i].name); 
     ++counter; 
    for (var j = 0 ; j<staticD[i].applications.length;j++){ 
    //var RObj; 
    //var AObj; 
     //console.log("Application Name " + staticD[i].applications[j]); 
     var applicationName = staticD[i].applications[j]; 
     var test = new Object(); 
     test.data = []; 
     var resultSet; 

    var response = reference.find({'appname' : applicationName , 'track' : trackName }).sort({'_id': -1}); 
    var promise = response.exec(); 
    var alertT = alert.find({'appname' : applicationName , 'track' : trackName }).sort({'_id': -1}).limit(1); 
    var promise1 = alertT.exec(); 

     promise.then(function allRefRecords (recordAlerts){ 
     if(recordAlerts.length >0){ 
      //console.log('Ref Length' + recordAlerts.length); 
     recordAlerts.forEach(function refRecord(R){ 
      testObject.data.testInfra.push(R); 
      //console.log('testObject' + testObject.data.testInfra); 
      }); 
    } 

      }); 

     promise1.then(function allAlertsRecords (alerts){ 
      if(alerts.length > 0){ 
     alerts.forEach(function refRecord(a){ 
     // console.log('a' + a) 
     testObject.data.testCustom.push(a); 
      //console.log('testObject' + testObject.data.testCustom); 
     // res.json(testObject); 

     }); 
     }   
      }) 
     .then(function(){ 
      resultSet = compareData(testObject.data.testCustom,testObject.data.testInfra); 
      test.data.push(resultSet); 
      }) 
     .then(function(){ 
      res.json(test); 
     }); 
    } 

    } 

} 

}); 

}); 
+1

답을 찾을 수 있습니다. – Shrabanee

+0

나는 코드에서 약속을했지만 변수 결과가 나타납니다. 언젠가 나는 2 개의 레코드와 때로는 3을 얻고있다. – Harsh

답변

3

은하지 둥지 기능을 수행 그들에게 이름을 부여하고 프로그램의 최상위 레벨 에 배치합니다. 기능을 이용하여 기능을 '아래'로 이동하십시오. 모든 콜백의 모든 오류를 처리하고 도와주기 위해 linter 표준을 사용하십시오. 재사용 가능한 함수를 만들고 모듈에 두어 코드를 이해하는 데 필요한인지 부하를 줄입니다. 코드를 이렇게 작은 조각으로 나누면 오류를 처리하고 테스트를 작성하고 코드에 대한 안정적이고 문서화 된 공개 API를 작성해야하며 리팩토링에 도움이됩니다.

출처 : http://callbackhell.com/

디자인 및 기타 여러 가지 방법 ... 시간의 그러나 99 %로, 약속, ASYNC와 콜백 지옥을 피할 수있다, 디자인은 최고 (IMHO) 인 너는 다른 것들을 필요로하지 않는다.

일부 링크 :
How to Elegantly Solve the Callback Hell
Avoiding Callback Hell in Node.js

가 콜백 지옥이 사망하지 않습니다 기억)

+0

나는 코드에서 약속을 시도했지만 결과를 얻는다. 그러나 결과의 레코드 수는 무작위입니다. 의미가 언젠가 나는 2 개의 레코드를 얻고 있으며 언젠가는 3이며 이는 동일한 요청에 대한 응답입니다.내가 원하는 건 : 참조 컬렉션에서 하나의 레코드를 얻은 다음 경고 컬렉션에서 하나를 가져온 다음 이전 단계에서 가져온 두 객체를 비교하고 결과를 다시 반환합니다. 코드 스 니펫도 추가하고 있습니다. – Harsh

+0

코드 스 니펫 # 1 응답 = reference.find ({ 'appname': applicationName, 'track': trackName}) sort ({ '_ id': -1}); var promise; promise = response.exec(); var alertT; alertT = alert.find ({ 'appname': applicationName, 'track': trackName}) sort ({ '_ id': -1}). 제한 (1); var promise1; promise1 = alertT.exec(); – Harsh

+0

코드 스 니펫 # 2 : promise.then (function allRefRecords (recordAlerts) { if (recordAlerts.length == 1) { recordAlerts.forEach (function refRecord (testObject.data.testInfra.push (R); }), } }); – Harsh

0

몇 가지 팁은 다음 라이브러리를 검색 할 수 지옥콜백의 또 다른 모양을 방지하기 위해 :

  • async.js : 네스트없이 함수를 연속적으로 실행할 수 있습니다.
  • Bluebird : 비동기식 로직은 매핑 및 대기열에 추가로 관리 할 수 ​​있습니다.
  • Q :은 중첩 호출을 손쉽게 관리 할 수 ​​있다는 약속의 개념을 보여줍니다. 더 많은 질문이있을 경우

, 당신은 내가 대신 루프 사용하는 코드에서`async`를 사용하는 것이 좋습니다 것입니다 여기 https://artjoker.net/blog/nodejs-essentials-keeping-its-benefits-in-order/