P
P
Pavel2021-06-25 19:51:07
Node.js
Pavel, 2021-06-25 19:51:07

How to make nested async.eachSeries work?

Hello.
Faced a problem, it is necessary to sort out an array with categories asynchronously. Categories up to the 5th nesting level. In each iteration, I need to carry out asynchronous operations, preferably in order, but this is not critical.

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


In principle, when categoriesData was sent to the database instead of pushing, there were no problems, in any case, the categories ended up in the database, the script continued to work.

prepare()
Just rebuilds the array for the database.
-------------------------
The console output shows that eachSeries is not running asynchronously
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


-------------------------
Can eachSeries work like this at all?
Is it even possible, and does it make sense, to use so many nested eachSeries?
Can you suggest a better approach...

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question