我在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);
});
}
}
}
});
});
答案 0 :(得分:3)
不要嵌套函数,给它们命名并将它们放在顶层 你的程序。使用功能提升有利于移动 功能&#39;低于折叠&#39;。处理每一个中的每一个错误 你的回调和使用标准的linter来帮助你 这个。创建可重用的函数并将它们放在模块中以减少 理解代码所需的认知负荷。分裂你的 像这样的小块代码也可以帮助你处理错误,写 测试,强制您为其创建稳定且记录的公共API 你的代码,并有助于重构。
可以通过ASYNC,PROMISES,DESIGNS以及许多其他方式避免回调地狱...... 但99%的时间,设计是最好的(imho),你不需要其他东西。
一些链接:
How to Elegantly Solve the Callback Hell
Avoiding Callback Hell in Node.js
请记住,回调地狱不是致命的;)
答案 1 :(得分:0)
防止进一步出现 Callback Hell 的一些提示,您可以浏览下一个库: