Задать вопрос
@Asokr

Как заставить работать вложенные async.eachSeries?

Здравствуйте.
Столкнулся с проблемой, нужно асинхронно перебрать массив с категориями. Категории вплоть до 5-го уровня вложенности. В каждой итерации мне нужно проводить асинхронные операции, желательно по порядку, но это не критично.
spoiler
Получился у меня такой монстр
await eachSeries(categories, async (category) => {
    console.log(`Обрабатываем категорию ${category.name}`);
    // тут разбираем внутренности, кое-то кидаем в базу
    // и кое-что кидаем в общий массив
    categoriesData.push(prepare(category));

    if (category.hasOwnProperty('childNodes')) {
        // Второй уровень категорий
        let second_level = category.childNodes;
        await eachSeries(second_level, async (cat_second) => {
            
            // тут разбираем внутренности, кое-то кидаем в базу
            // и кое-что кидаем в общий массив
            categoriesData.push(prepare(cat_second));

            if (cat_second.hasOwnProperty('childNodes')) {
                // Третий уровень категорий
                let third_level = cat_second.childNodes;
                await eachSeries(third_level, async (cat_third) => {
                   
                    // тут разбираем внутренности, кое-то кидаем в базу
                    // и кое-что кидаем в общий массив
                    categoriesData.push(prepare(cat_third));
                  
                    if (cat_third.hasOwnProperty('childNodes')) {
                        // Четвертый уровень категорий
                        let fourth_level = cat_third.childNodes;
                        await eachSeries(fourth_level, async (cat_fourth) => {

                        // тут разбираем внутренности, кое-то кидаем в базу
                        // и кое-что кидаем в общий массив
                        categoriesData.push(prepare(cat_fourth));
                       
                            if (cat_fourth.hasOwnProperty('childNodes')) {
                                // Пятый уровень категорий
                                let fifth_level = cat_fourth.childNodes;
                                for (cat_fifth of fifth_level) {

                                    // тут разбираем внутренности, кое-то кидаем в базу
                                    // и кое-что кидаем в общий массив
                                    categoriesData.push(prepare(cat_fourth));
                                    
                                }
                            }
                        return true;    
                        }, (err) => {console.log('level 4'); console.log(err); });
                    }
                return true;    
                }, (err) => {console.log('level 3'); console.log(err); });
            }
        return true;    
        }, (err) => {console.log('level 2'); console.log(err); });
    }
return true;
}, (err) => {console.log('level 1'); console.log(err); });


В принципе когда вместо пуша в categoriesData была отправка в базу - проблем не наблюдалось, во всяком случае, категории оказывались в базе, скрипт продолжал работать.

prepare()
Просто пересобирает массив для базы данных.
-------------------------
По выводу консоли видно, что eachSeries работает не асинхронно
spoiler

Обрабатываем категорию Красота
Обрабатываем категорию Игрушки
Обрабатываем категорию Продукты
Обрабатываем категорию Зоотовары
Обрабатываем категорию Канцтовары
Обрабатываем категорию Здоровье
level 1
null
level 3
null
Ошибка при добавлении категорий в базу. Error: 400: Bad Request
Категории добавлены и обновлены. Заняло времени:  00:00:00.03
level 3
null
level 3
null
level 3
null
level 3
null


-------------------------
Может ли eachSeries вообще так работать?
Можно ли вообще, и имеет ли смысл, использовать столько вложенных eachSeries?
Может подскажите более правильный подход...
  • Вопрос задан
  • 50 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы