JavaScriptasynchronouscallback地狱

我有一个应用程序,我使用asynchronous,以避免“意大利面callback”,并正常工作,但在某些平行调用,我不得不作出一些更改,因为值之前必须改变,因为这些变化做了同样的例程,我想做一个function,这样做,从而节省代码,但不工作的应用程序( 我是新来的JavaScript和我正在学习 )。

debugging(console.log),在某些情况下的错误是相同的callback,他从不同的请求调用(如果他们是本地variables不明白这是怎么回事)。 我试图用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

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

我想我将不得不复制引入并行asynchronous调用的代码,因为我无法操作。

我的错误是多种多样的 在各种testing中,我评论了对该函数的调用,并且我已经build立了从几个并行调用中callback为0的callback,并且我已经看到,没有运行最终的async.parallelcallback函数(例如,如果我评论了除今天,昨天和星期)。 在其他情况下(将所有呼叫build立为注释并将值设置回0,除了在昨天和星期),运行两周的callback。 如果对该函数的所有调用都进行了注释,除了星期和今天,它将导致一个exception显示消息“ 错误:callback已被调用 ”。

我被困了好几天,找不到错误或如何解决这个问题:-S

谢谢。

修正!

其中一个使用函数的模块被称为对web api的请求,响应时间大大延迟。