Обратный вызов НЕОБРАБОТАННОГО вызова уже был вызван в параллельном aysnc

#javascript #node.js #async.js

Вопрос:

Я использую асинхронную параллель для параллельного получения данных из БД. Когда каждая задача возвращает данные, я сохраняю их в локальном объекте.

От index.js Я звоню cacheService.js . В cacheService.js Я загружаю данные из базы данных mysql и базы данных mongo в объект кэша. Всякий раз, когда я выполняю npm, запускайте локальный запуск. Я получаю следующую ошибку.

Ошибка НЕОБРАБОТАННОГО ЗАПРОСА: Обратный вызов уже был вызван.

Эта ошибка исходит из loadMongoData метода cacheService.js. Я следовал другим ответам на stackoverflow, таким как добавление другой части

Вот код для cacheService.js .

 'use strict';

var cache = [];
class cacheService {
    async init() {
        await this.loadMongoData();
    }

  
loadMongoData(env, callback1) {
    const _this = this;
    console.log('Inside loadMongoData')
    async.parallel(
        {
            task1: function (callback) {
                CriteriaDef.find({})
                    .lean()
                    .exec(function (err, criteriaDefs) {
                        if (err) {
                            console.log('Inside err 1')
                            logger.error('Error fetching CriteriaDef: ', util.inspect(err));
                            callback(err, null);
                        } else if (criteriaDefs) {
                            console.log('Inside criteriaDefs')
                            if (criteriaDefs.length amp;amp; criteriaDefs.length > 0) {
                                console.log('Inside criteriaDefs 1')
                                global.CRITERIA_DEFS = criteriaDefs;
                                cache['criteria_defs'] = criteriaDefs;
                            }
                            callback(null, null);
                        }
                    });
            },
            task2: function (callback) {
                groupDef
                    .find({})
                    .lean()
                    .exec(function (err, groupDefs) {
                        if (err) {
                            console.log('Inside err2')
                            logger.error('Error fetching groupDefs: ', util.inspect(err));
                            callback(null, err);
                        } else if (groupDefs) {
                            console.log('Inside ')
                            global.groupDefsWithRoles = groupDefs;
                            let _groupDefs = [];
                            _.each(groupDefs, function (groupDef) {
                                var data = {
                                    value: groupDef._id,
                                    label: `${groupDef._id}: ${groupDef.description}`
                                };
                                _groupDefs.push(data);
                            });
                            global.groupDefs = _groupDefs;
                            cache['groupDefs'] = _groupDefs;
                            logger.info('Loaded groupDefs: ', global.groupDefs.length);
                            callback(null, null);
                        }
                    });
            },
            task3: function (callback) {
                jiraProjects.find({$or: [{archived: {$ne: true}}, {archived: {$exists: false}}]}).exec(function (err, jiraProjects) {
                    if (err) {
                        console.log('Inside error 3')
                        logger.error('Error fetching jiraProjects: ', err);
                        callback(null, err);
                    } else if (jiraProjects) {
                        console.log('Inside jira project')
                        let _jiraProjects = [];
                        _.each(jiraProjects, function (jiraProject) {
                            var data = {
                                value: jiraProject.key,
                                label: jiraProject.key,
                                issueType: jiraProject.issueType ? jiraProject.issueType : 'Bug'
                            };
                            _jiraProjects.push(data);
                        });
                        global.jiraProjectsList = _jiraProjects;
                        cache['jiraProjects'] = _jiraProjects;
                        logger.info('Loaded jira projects: ', global.jiraProjectsList.length);
                        callback(null, null);
                    }
                });
            },
            task4: function (callback) {
                console.log('Inside task4')
                callback(null, null);
            },
            task5: function (callback) {
                inputElements
                    .find({})
                    .lean()
                    .exec(function (err, inputElements) {
                        if (err) {
                            console.log('Inside error5')
                            logger.error('Error fetching inputElements: ', util.inspect(err));
                            callback(null, err);
                        } else if (inputElements) {
                            console.log('Inside inputelements')
                            global.INPUT_ELEMENTS_DEF = inputElements;
                            cache['INPUT_ELEMENTS_DEF'] = inputElements;
                            callback(null, null);
                        }
                    });
            },

            task6: function (callback) {
                console.log('Inside task6')
                sisp.loadProducts('', callback);
            }
        },
        function (err, results) {
            if (err) {
                console.log('Inside final error')
                logger.error("Something went wrong can't start the app: ", util.inspect(err));
                callback1(null, err);
            } else {
                console.log('Inside final else')
                logger.info('loaded all globals properly :)');
                callback1(null, null);
            }
        }
    )
}
}
export default new cacheService();
 

Ответ №1:

Я думаю, что ваша проблема в том, что вы используете обратный вызов внутри обещания.

Пожалуйста, измените свой код следующим образом:

 class cacheService {
    async init() {
        await new Promise((resolve, reject) => {
           this.loadMongoData(env, (ignoreArg, error) => {
              if (error) {
                return reject(error);
              }

              resolve();   
           });
       });
    }

...
}
 

Совет: в каждой задаче добавьте инструкцию else для обратного вызова, потому что, возможно, ваша инструкция не обработана и ваш код не может выполнить префект

 task1: function (callback) {
                CriteriaDef.find({})
                    .lean()
                    .exec(function (err, criteriaDefs) {
                        if (err) {
                            console.log('Inside err 1')
                            logger.error('Error fetching CriteriaDef: ', util.inspect(err));
                            callback(err, null);
                        } else if (criteriaDefs) {
                            console.log('Inside criteriaDefs')
                            if (criteriaDefs.length amp;amp; criteriaDefs.length > 0) {
                                console.log('Inside criteriaDefs 1')
                                global.CRITERIA_DEFS = criteriaDefs;
                                cache['criteria_defs'] = criteriaDefs;
                            }
                            callback(null, null);
                        } else {
                            callback(null, null);
                        }
                    });
            },
 

Комментарии:

1. Спасибо вам за комментарии . Предложенные изменения не решили проблему