fetchAllPages.ts 1.1 KB

123456789101112131415161718192021222324252627282930
  1. /**
  2. * 按分页拉取全量列表(用于 ExportModal 等「全量数据」场景)
  3. */
  4. export async function fetchAllPages<T>(options: {
  5. /** 每页条数,默认 1000 */
  6. pageSize?: number;
  7. /** 初始查询条件(会拷贝后写入 page_no / page_size) */
  8. initialQuery: Record<string, unknown>;
  9. /** 页码字段名,默认 page_no */
  10. pageNoKey?: string;
  11. /** 每页条数字段名,默认 page_size */
  12. pageSizeKey?: string;
  13. /** 拉取一页,返回 total 与 list */
  14. fetchPage: (query: Record<string, unknown>) => Promise<{ total: number; list: T[] }>;
  15. }): Promise<T[]> {
  16. const pageSize = options.pageSize ?? 1000;
  17. const pageNoKey = options.pageNoKey ?? "page_no";
  18. const pageSizeKey = options.pageSizeKey ?? "page_size";
  19. const query = { ...options.initialQuery };
  20. query[pageNoKey] = 1;
  21. query[pageSizeKey] = pageSize;
  22. const all: T[] = [];
  23. while (true) {
  24. const { total, list } = await options.fetchPage(query);
  25. all.push(...list);
  26. if (all.length >= total || list.length === 0) break;
  27. query[pageNoKey] = (query[pageNoKey] as number) + 1;
  28. }
  29. return all;
  30. }