У меня есть объект Category
, у каждого Category
есть SubCategories
. Как правильно загрузить каждый Category
свой SubCategories
?
const getCategories = async () => {
const { data: categories } = await axios.get(`api/Categories/GetCategories`);
return categories;
};
const getSubCategories = async catId => {
const { data: subCategories } = await axios.get(`../api/SubCategories/GetSubCategories?catId=${catId}`);
return subCategories;
};
Это простой, но неоптимальный метод из-за отсутствия асинхронности.
const categories = getCategories().map(category => {
return {
category
, subCategory: getSubCategories(category.catId)
}
})
Лучшим способом было бы удалить await
из getSubCategories
и просто вернуть обещание.
const getSubCategories = async catId => axios.get(`../api/SubCategories/GetSubCategories?catId=${catId}`)
Когда вы возвращаете промисы, они могут выполняться асинхронно.
const categories = getCategories()
Если вы используете асинхронную функцию, вы можете сделать:
const subCategories = await Promise.all(categories.map(category => getSubCategories(category.catId))
const categoriesWithSub = zipWith(categories, subCategories, (category, subCategory) => ({category, subCategory}))
Иначе
Promise.all(categories.map(category => getSubCategories(category.catId))
.then(subCategories => {
const categoriesWithSub = zipWith(categories, subCategories, (category, subCategory) => ({category, subCategory}))
})
categoriesWithSub
— это массив объектов следующей формы.
[{
category: {} // however your original category object looked like.
, subCategory: [] // The array of subCategories for this category.
}]
В этом случае zipWith возвращает массив объектов, каждый из которых имеет два свойства: категорию и подкатегории. Я обновлю ответ.
Спасибо, однако подкатегории всегда пусты {}
Дох, да, я забыл одну вещь. Promise.all возвращает обещание, а не массив. Обновление ответа. Кодировать вслепую непросто
Спасибо за ваш ответ, не могли бы вы объяснить, как работает
zipWith
? В основном мне нужен массивcategories
, каждый объектcategory
должен иметь массивsubCategories