NodeJS异步:已经调用了回调吗?

时间:2017-04-19 13:49:32

标签: javascript node.js async.js

我收到此错误:

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

在我的async.each调用中,似乎它正试图调用" done()"超过一次"电路"但是我不明白为什么,虽然一旦调用了异步回调,函数就会退出?

Circuits是一个包含id的String数组。我只是试图遍历它们来对每个数据库执行异步调用。

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');
    }
}

2 个答案:

答案 0 :(得分:0)

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

当您发现或发生错误而非callback()使用return callback()时。 这将阻止执行您看到的返回语句和错误的代码。

希望这有帮助。

答案 1 :(得分:0)

我认为你必须在没有返回的情况下将你的异步回调称为“完成”:

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

并出现类似这样的错误:

done('errormessage');

因此,您可以在每个

后的“最终”回调中获得结果

请参阅async