Node.js中的回调地狱

时间:2016-08-25 11:51:34

标签: javascript node.js mongodb asynchronous

我在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);
        });
    }

  }

}

});

});

2 个答案:

答案 0 :(得分:3)

  

不要嵌套函数,给它们命名并将它们放在顶层   你的程序。使用功能提升有利于移动   功能&#39;低于折叠&#39;。处理每一个中的每一个错误   你的回调和使用标准的linter来帮助你   这个。创建可重用的函数并将它们放在模块中以减少   理解代码所需的认知负荷。分裂你的   像这样的小块代码也可以帮助你处理错误,写   测试,强制您为其创建稳定且记录的公共API   你的代码,并有助于重构。

来源:http://callbackhell.com/

可以通过ASYNC,PROMISES,DESIGNS以及许多其他方式避免回调地狱...... 但99%的时间,设计是最好的(imho),你不需要其他东西。

一些链接:
How to Elegantly Solve the Callback Hell
Avoiding Callback Hell in Node.js

请记住,回调地狱不是致命的;)

答案 1 :(得分:0)

防止进一步出现 Callback Hell 的一些提示,您可以浏览下一个库:

  • Async.js:您可以在不嵌套的情况下执行系列函数。
  • Bluebird:异步逻辑可以通过映射和排队更易于管理。
  • 问:揭示了承诺的概念,即毫不费力地管理嵌套调用。