這是我的 for 回圈,它運行 2 個列舉,并將它們都發送到服務器,獲取一個值,并通過另一個 for 回圈計算該值。很確定它可以改進。這是代碼:
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;
我的主要目標是減少時間,盡管我知道服務器將獲得相同數量的查詢,因此差異不會很大。謝謝。
uj5u.com熱心網友回復:
您可以使用 [Promise.all][1]。
這是示例代碼段。
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/all
使用相同方法的另一種方法
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;
}
uj5u.com熱心網友回復:
一開始,我將邏輯分為 3 個部分:
- 準備異步呼叫
- 并行解決異步呼叫
- 應用我的業務邏輯
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;
uj5u.com熱心網友回復:
正如其他答案所暗示的那樣,您可以使用Promise.all()。無需太多重構,您就可以撰寫:
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); // <-- weird 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 };
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311103.html
標籤:javascript 打字稿 表现 下一个.js
