NodeJS Async:回调已经调用了吗?
NodeJS Async: callback allready called?
我收到这个错误:
node:19100) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Callback was already called.
在我的 async.each 调用中,它似乎试图在每个 "circuit" 中多次调用 "done()" 但我不明白为什么,我虽然那一次异步调用回调函数将退出?
Circuits 是一个包含 ID 的字符串数组。我只是想遍历它们以对每个数据库执行异步调用。
var getTimeseriesForCircuit = function(circuits, to, from, callback){
if (!validateDates(from, to)) {
return callback(400, 'Invalid date(s)');
}
var validJSON = false;
try {
circuits = JSON.parse(circuits);
validJSON = true;
}
catch (e) {
return callback(500, e);
}
if (validJSON) {
async.each(circuits, function (circuitID, done) {
var frequency = getFrequencyFromRange(from, to);
var influxFromDate = from * 1000000;
var influxToDate = to * 1000000;
getVoltageGatewayID(null, circuitID, function (gatewayID) {
getVoltageFromInflux(null, influxFromDate, influxToDate, gatewayID, frequency, function (voltage) {
getMeanAmpsFromInflux(null, influxFromDate, influxToDate, circuitID, frequency, function (data) {
if (JSON.stringify(data) != []) {
var timeWithPower = calculatePower(data, voltage);
return done(null, {'circuitID': circuitID, data: timeWithPower});
}
});
});
});
}, function (err, results) {
if (err) {
return callback(500, err)
} else {
return callback(200, results)
}
});
}
else {
return callback(400, 'The circuits sent were not in a valid format');
}
}
我认为你在函数中缺少 return 语句。
当您捕获到错误或遇到错误而不仅仅是 callback()
时,请使用 return callback()
。
这将阻止执行下面的代码 return 语句和您看到的错误。
希望对您有所帮助。
我认为您必须在没有 return 的情况下调用异步回调 "done":
done(null, {'circuitID': circuitID, data: timeWithPower});
如果出现这样的错误:
done('errormessage');
所以你在每个
之后的 "final" 回调中得到你的结果
我收到这个错误:
node:19100) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Callback was already called.
在我的 async.each 调用中,它似乎试图在每个 "circuit" 中多次调用 "done()" 但我不明白为什么,我虽然那一次异步调用回调函数将退出?
Circuits 是一个包含 ID 的字符串数组。我只是想遍历它们以对每个数据库执行异步调用。
var getTimeseriesForCircuit = function(circuits, to, from, callback){
if (!validateDates(from, to)) {
return callback(400, 'Invalid date(s)');
}
var validJSON = false;
try {
circuits = JSON.parse(circuits);
validJSON = true;
}
catch (e) {
return callback(500, e);
}
if (validJSON) {
async.each(circuits, function (circuitID, done) {
var frequency = getFrequencyFromRange(from, to);
var influxFromDate = from * 1000000;
var influxToDate = to * 1000000;
getVoltageGatewayID(null, circuitID, function (gatewayID) {
getVoltageFromInflux(null, influxFromDate, influxToDate, gatewayID, frequency, function (voltage) {
getMeanAmpsFromInflux(null, influxFromDate, influxToDate, circuitID, frequency, function (data) {
if (JSON.stringify(data) != []) {
var timeWithPower = calculatePower(data, voltage);
return done(null, {'circuitID': circuitID, data: timeWithPower});
}
});
});
});
}, function (err, results) {
if (err) {
return callback(500, err)
} else {
return callback(200, results)
}
});
}
else {
return callback(400, 'The circuits sent were not in a valid format');
}
}
我认为你在函数中缺少 return 语句。
当您捕获到错误或遇到错误而不仅仅是 callback()
时,请使用 return callback()
。
这将阻止执行下面的代码 return 语句和您看到的错误。
希望对您有所帮助。
我认为您必须在没有 return 的情况下调用异步回调 "done":
done(null, {'circuitID': circuitID, data: timeWithPower});
如果出现这样的错误:
done('errormessage');
所以你在每个
之后的 "final" 回调中得到你的结果