Async.js "Обратный звонок уже был вызван";не может отлаживать - PullRequest
0 голосов
/ 23 октября 2019

Я использую async.js, чтобы помочь с проверкой и преобразованиями для импорта данных. После перемещения фрагмента кода в его собственную функцию я получаю сообщение об ошибке «Callback уже был вызван». из async.js. Трассировка стека не содержит полезной информации об отладке. Точный код работает нормально, когда я вызываю его напрямую. Мне нужно использовать его для нескольких импортов, поэтому я перешел к объекту, содержащему другие «преобразователи». Все они работают нормально.

Я попытался вставить следующий код в функцию, чтобы попытаться отладить:

return cb("test);

Он работает нормально и возвращает ошибку "test" в браузер, еслиЯ добавляю его в первую строку функции. Вставка его в другое место вызывает ошибку.

Работает следующее. Если я переместлю "return cb (" error); "в строку после let query = ..., то произойдет сбой с ошибкой обратного вызова. Я совершенно запутался.

user(options = {
        select: "id",
        return: "id",
        lean: true,
    }) {
        return (value, cb) => {
            if (!value) {
                return cb(null, null);
            }

            return cb("test");

            let query = User.findOne({
                $or: [{
                        email: value.toLowerCase()
                    },
                    {
                        username: value
                    },
                ]
            }).select(options.select);

            if (options.lean) {
                query.lean();
            }

            query.exec((error, user) => {
                if (error) {
                    return cb(error);
                }

                if (!user) {
                    return cb(`user not found: ${value}`);
                }

                if (options.return == "object") {
                    cb(null, user);
                } else {
                    cb(null, user._id);
                }
            });
        }
    }

Переменная" cb "передается из асинхронного вызова:

        async.mapValues(self.options.validators, (validators, key, cb) => {
            //Get the value that is being validated
            var value = _.get(document, key);
            var isArray = false;

            //Enforce array type
            if (!Array.isArray(validators)) {
                validators = [validators];
            }

            //Transform the value before validating it
            var transformer = _.get(self.options.transformers, key);

            //Don't run transformer if empty value
            if (!transformer || value == null) {
                transformer = (value, cb) => cb(null, value);
            }

            transformer(value, (error, newValue) => {
                //Check error
                if (error) {
                    return _cb(error);
                }

                //Set new value
                value = newValue;
                _.set(document, key, newValue);
...