2014-11-08 156 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,很大程度上延遲響應。