2014-11-08 151 views
1

我有一个应用程序,我用异步,以避免“意大利面回调”,并正常工作,但在某些平行调用我不得不作出一些更改,因为在返回之前必须更改值,因为这些更改做了相同的例程,我认为做一个函数来这样做,从而节省代码,但不适用于应用程序(我是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

谢谢你。

+0

如果我修改数组值(var values = [....])的内容并包含单个元素,则它在async.each版本中正常工作。 我不明白发生了什么事。 – Anto 2014-11-08 23:55:14

回答

2

固定!

使用函数的模块之一被称为请求Web API,很大程度上延迟响应。