我有一個應用程序,我用異步,以避免「意大利麪回調」,並正常工作,但在某些平行調用我不得不作出一些更改,因爲在返回之前必須更改值,因爲這些更改做了相同的例程,我認爲做一個函數來這樣做,從而節省代碼,但不適用於應用程序(我是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