【问题标题】:NodeJS Async: callback allready called?Node JS Async:已经调用了回调?
【发布时间】:2017-09-15 19:10:17
【问题描述】:

我收到此错误:

node:19100) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Callback was already called.

在我的 async.each 调用中,它似乎试图调用“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');
    }
}

【问题讨论】:

  • 我不明白你在第一句话中的意思。你能解释一下你的意思吗?
  • 你可能调用了 3 次回调:如果validateDates(from, to) 为假,则调用一次,如果JSON.parse() 抛出错误,则调用两次。
  • 我的问题不清楚,我更新了它,错误在异步调用中而不是在函数的其余部分。

标签: javascript node.js async.js


【解决方案1】:

我认为你必须调用你的异步回调“完成”而不返回:

done(null, {'circuitID': circuitID, data: timeWithPower});

如果出现类似这样的错误:

done('errormessage');

所以你在每个之后的“最终”回调中得到你的结果

async

【讨论】:

    【解决方案2】:

    我认为您在函数中缺少 return 语句。

    当您发现或遇到错误时,而不仅仅是callback(),请使用return callback()。 这将阻止执行下面的代码返回语句和您看到的错误。

    希望这会有所帮助。

    【讨论】:

    • 我的问题不清楚我已经更新了,错误来自 asycn.each 调用而不是函数的其余部分。
    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2023-03-21
    • 2017-10-13
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多