Aquí está mi bucle for, se ejecuta en 2 enumeraciones y las envía al servidor, obtiene un valor y calcula el valor a través de otro bucle for. Seguro que se puede mejorar. aquí está el código:
const paths = []; for await (let category of Object.values(CategoriesEnum)) { for await (let format of Object.values(FormatsEnum)) { const totalPosts = await getPagesCount(category, format); const totalPages = Math.ceil(totalPosts.offsetPagination.total / 12); for (let page = 1; page <= totalPages; page++) { paths.push({ params: { category: category , format: format page: page } }); } } } return paths;Mi objetivo principal es reducir el tiempo, aunque entiendo que el servidor recibirá la misma cantidad de consultas, por lo que las diferencias no serán enormes. Gracias.
Puede usar [Promise.all][1].
Aquí está el fragmento de muestra.
let promises = []; let paths = []; Object.values(CategoriesEnum).forEach(category => { Object.values(FormatsEnum).forEach(format => { promises.push(getPagesCount(category, format)) }) }); const totalPostCounts = await Promise.all(promises); totalPostCounts.forEach(totalPosts => { const totalPages = Math.ceil(totalPosts.offsetPagination.total / 12); for (let page = 1; page <= totalPages; page++) { paths.push({ params: { category: category, format: format, page: page } }); } }); return paths; [1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allOtro enfoque usando los mismos métodos
let promises = []; let paths = []; /* Gather Api calls */ Object.values(CategoriesEnum).forEach(category => { Object.values(FormatsEnum).forEach(format => { promises.push(getPath(category, format)) }) }); // wait for the call const pathsArray = await Promise.all(promises); // flat the array pathsArray.forEach(pathArray => { paths = paths.concat(pathArray) }); async function getPath(category, format) { let paths = []; const totalPosts = await getPagesCount(category, format); const totalPages = Math.ceil(totalPosts.offsetPagination.total / 12); for (let page = 1; page <= totalPages; page++) { paths.push({ params: { category: category, format: format, page: page } }); } return paths; }Para empezar, dividiría la lógica en 3 partes:
const pagesPromises = [] for (let category of Object.values(CategoriesEnum)) { for (let format of Object.values(FormatsEnum)) { pagesPromises.push(getPagesCount(category, format)) } } const totalPostsResults = await Promise.all(pagesPromises) const paths = []; totalPostsResults.forEach(totalPosts => { const totalPages = Math.ceil(totalPosts.offsetPagination.total / 12); for (let page = 1; page <= totalPages; page++) { paths.push({ params: { category: category , format: format page: page } }); } }) return paths;Como sugieren otras respuestas, puede usar Promise.all() . Sin mucha refactorización puedes escribir:
const getStaticPaths = async () => { const paths = []; const promises = []; // : Array<Promise<void>> in ts Object.values(CategoriesEnum).forEach((category) => { Object.values(FormatsEnum).forEach((format) => { promises.push(async () => { const totalPosts = await getPagesCount(category, format); // <-- confusing name though, I'd prefer `getPostsCount` instead const totalPages = Math.ceil(totalPosts.offsetPagination.total / 12); for (const page = 1; page <= totalPages; ++page) paths.push({ params: { category: category, format: format, page: page } }); }); }); }); await Promise.all(promises); return { paths }; }; export { getStaticPaths };