Здравствуйте.
Столкнулся с проблемой, нужно асинхронно перебрать массив с категориями. Категории вплоть до 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?
Может подскажите более правильный подход...