2016-08-25 3 views
-4

Я испытываю ситуацию с обратным обращением в Node.js.Callback hell in Node.js

В основном то, что я хочу это:

чтения данных из статического 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

Я предлагаю вам использовать 'async' в коде, вместо того, чтобы использовать для петли. – Shrabanee

+0

Я пробовал обещания в коде, однако я получаю переменные результаты. иногда я получаю 2 записи, а иногда 3. – Harsh

ответ

3

не гнездятся функции, дать им имена и разместить их на самом высоком уровне вашей программы. Используйте функцию подъема в ваших интересах для перемещения функций «под складкой». Обрабатывайте каждую отдельную ошибку в каждом из ваших обратных вызовов и используйте стандарт linter, который поможет вам с . Создайте функции многократного использования и поместите их в модуль, чтобы уменьшить когнитивную нагрузку, необходимую для понимания вашего кода. Разделение вашего кода на мелкие кусочки, подобные этому, также помогает вам обрабатывать ошибки, писать тесты , заставляет вас создать стабильный и задокументированный публичный API для вашего кода и помогает в рефакторинге.

Источник: http://callbackhell.com/

можно избежать обратного вызова ад с асинхронным, с ОБЕЩАНИЯ, с КОНСТРУКЦИЙ, и многими другими способами ... Но 99% времени, дизайн является лучшим (имхо) и вам не нужны другие вещи.

Некоторые ссылки:
How to Elegantly Solve the Callback Hell
Avoiding Callback Hell in Node.js

Помните, что обратный вызов ад не является смертельным исходом;)

+0

Я пробовал обещания в коде, и теперь я получаю результаты. Однако количество записей в результатах является случайным. Значение когда-нибудь я получаю 2 записи и иногда 3, и это ответ на тот же запрос.Все, что я хочу, это: получить одну запись из справочной коллекции, затем получить ее из коллекции предупреждений, а затем сравнить два объекта, выбранных на предыдущем шаге, и вернуть результат обратно. Я также добавляю фрагменты кода. – Harsh

+0

Code Snippet # 1 response = reference.find ({'appname': applicationName, 'track': trackName}). Sort ({'_ id': -1}); var prom; prom = response.exec(); var alertT; alertT = alert.find ({'appname': applicationName, 'track': trackName}). Sort ({'_ id': -1}). Limit (1); var prom1; prom1 = alertT.exec(); – Harsh

+0

Code Snippet # 2: prom.then (function allRefRecords (recordAlerts) { if (recordAlerts.length == 1) { recordAlerts.forEach (функция refRecord (R) { testObject.data.testInfra.push (R); }); } }); – Harsh

0

Некоторые советы, чтобы предотвратить дальнейшее появление Callback Ад вы можете просматривать следующие библиотеки:

  • Async.js: вы можете выполнять функции последовательно, не вставляя их.
  • Bluebird: Асинхронная логика будет более управляемой с отображением и размещением.
  • Q: раскрывает концепцию обещания легко управлять вложенными вызовами.

Если у вас есть вопросы, вы можете найти ответы здесь https://artjoker.net/blog/nodejs-essentials-keeping-its-benefits-in-order/

Смежные вопросы