我有一个应用程序,我使用async来避免“spaghetti回调”并正常工作,但在某些并行调用中我必须进行一些更改,因为必须在返回之前更改值,因为这些更改使相同的例程我想创建一个函数来保存代码,但不能正常运行应用程序(我是javascript的新手,我正在学习)。
Debug(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);
}
并更改主要例程:
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
谢谢你。
答案 0 :(得分:2)
修正了!
其中一个使用函数的模块称为对web api的请求,响应时间很长。