我有一个应用程序,我用异步,以避免“意大利面回调”,并正常工作,但在某些平行调用我不得不作出一些更改,因为在返回之前必须更改值,因为这些更改做了相同的例程,我认为做一个函数来这样做,从而节省代码,但不适用于应用程序(我是JavaScript的新手,我正在学习)。Javascript异步回调地狱
调试(console.log),在某些情况下,错误与从不同请求调用的回调(如果它们是本地变量不知道这是怎么发生的)相同。我试图用forEach和async.each来更改代码,但在这两种情况下,我都有错误,不再有更多的改变继续尝试,找不到错误。
我原代码(我把它总结一下,以避免长的帖子):
async.parallel({
today: function(callback){
data.get('DATA', function(err, dataGet){
if(err){
callback(err);
}
callback(null, dataGet);
});
},
.... yesteday, week, month ....
year: function(callback){
data.get('DATA', function(err, dataGet){
if(err){
callback(err);
}
callback(null, dataGet);
});
}
},
function(error, results){
--- routine ----
});
而我的新代码是这样的:
功能
function getDataChange(key, valuePass, callback){
var values = [ .... ],
totalData = 0.00;
/*
async.each(values, function(value, cb){
var keyR = key.replace(/%value%/g, value.toLowerCase());
data.get(keyR, function(err, dataGet){
if(err){
cb(err);
}
dataGet = (dataGet !== null) ? dataGet : 0 ;
if(valuePass === value) {
totalData += parseFloat(dataGet);
cb();
} else {
valueConverter.convert({ force: true, multi: true }, function(data){
totalData += parseFloat(data);
cb();
});
}
});
},
function(err){
if(err){
callback(err);
} else {
callback(null, totalData);
}
});
*/
var totals = values.length;
values.forEach(function(value){
var keyR = key.replace(/%value%/g, value.toLowerCase());
data.get(keyR, function(err, dataGet){
if(err){
return callback(err);
}
dataGet = (dataGet !== null) ? dataGet : 0 ;
total--;
if(valuePass === value) {
totalData += parseFloat(dataGet);
if(totals === 0){
callback(null, totalData);
}
} else {
valueConverter.convert({ force: true, multi: true }, function(data){
totalData += parseFloat(data);
if(totals === 0){
callback(null, totalData);
}
});
}
});
});
//callback(null, totalData);
}
并改变主要例程E:
var keyBase = '......',
value = '.....';
async.parallel({
today: function(callback){
/*
data.get('DATA', function(err, dataGet){
if(err){
callback(err);
}
callback(null, dataGet);
});
*/
getDataChange(keyBase + 'DATAD', value, function(err, returnData){
if(err){
callback(err);
}
//console.log('## Return Data today');
callback(null, returnData);
});
//callback(null, 0);
},
.... yesteday, week, month ....
year: function(callback){
getDataChange(keyBase + 'DATAY', value, function(err, returnData){
if(err){
callback(err);
}
console.log('## Return Data year');
callback(null, returnData);
});
}
},
function(error, results){
--- routine ----
});
我想我要重复的代码并行异步调用介绍,因为我不能操作。
我的错误是多种多样的。在各种测试中,我评论了对该函数的调用,并且我已经在几次并行调用中将回调函数从回调函数中返回为0,并且我看到没有运行最终的async.parallel回调函数(例如,如果我评论了除今天,昨天和星期)。在其他情况下(将所有呼叫建立为注释并将值设置回0,除了在昨天和星期),运行两周的回调。如果对该功能的所有呼叫都进行了评论(周和今日除外),则会导致出现异常,显示消息“错误:回叫已被称为”。
我已经坚持了好几天,找不到错误或如何解决这个问题:-S
谢谢你。
如果我修改数组值(var values = [....])的内容并包含单个元素,则它在async.each版本中正常工作。 我不明白发生了什么事。 – Anto 2014-11-08 23:55:14