factus-js iconfactus-js

Paginación automática (listAll)

Recorre todas las páginas de un recurso sin manejar la paginación manualmente usando el iterador listAll().

Todos los módulos que devuelven listas paginadas exponen un método listAll() que es un async generator. Itera automáticamente por todas las páginas y entrega los ítems de uno en uno, sin que tengas que gestionar la paginación manualmente.

Módulos con listAll()

MóduloMétodo
factus.billslistAll(filter?)
factus.creditNoteslistAll(filter?)
factus.supportDocumentslistAll(filter?)
factus.adjustmentNoteslistAll(filter?)
factus.receptionlistAll(filter?)
factus.numberingRangeslistAll(filter?)

Ejemplo básico

for await (const invoice of factus.bills.listAll()) {
  console.log(invoice.number, invoice.status);
}

El iterador solicita páginas de 100 ítems y pasa automáticamente a la siguiente hasta que no quedan más.

Con filtros

Pasa un objeto de filtros como primer argumento:

import { InvoiceFilters } from "factus-js";

const filters: InvoiceFilters = { status: "2" }; // facturas validadas

for await (const invoice of factus.bills.listAll(filters)) {
  console.log(invoice.number);
}

Recopilar todos los ítems en un array

Si prefieres tener todos los resultados en memoria puedes usar el spread de Array.from o un for await acumulador:

const allBills = [];
for await (const bill of factus.bills.listAll()) {
  allBills.push(bill);
}

// O más conciso con Array.from
const allBills2 = [];
for await (const b of factus.bills.listAll()) allBills2.push(b);

Ten cuidado al recopilar grandes volúmenes en memoria. Si solo necesitas procesar los ítems o encontrar uno en concreto, usa break para detener el iterador anticipadamente.

Detener la iteración anticipadamente

listAll() es un generador perezoso: solo solicita la siguiente página cuando el iterador sigue avanzando. Puedes detenerlo con break sin que se realicen peticiones innecesarias:

for await (const invoice of factus.bills.listAll()) {
  if (invoice.status === "1") {
    console.log("Primera factura pendiente:", invoice.number);
    break; // detiene la iteración y no pide más páginas
  }
}

Con AbortSignal

Pasa un AbortSignal como segundo argumento para cancelar la paginación en cualquier momento:

const controller = new AbortController();
setTimeout(() => controller.abort(), 5000); // cancelar después de 5 s

try {
  for await (const invoice of factus.bills.listAll(
    {},
    { signal: controller.signal },
  )) {
    console.log(invoice.number);
  }
} catch (error) {
  if (error.name === "AbortError") {
    console.log("Iteración cancelada");
  }
}

Firma del método

listAll(
  filter?: TFilters,
  options?: RequestOptions,
): AsyncIterable<TItem>

Donde TFilters y TItem varían según el módulo (por ejemplo, InvoiceFilters / InvoiceListItem en factus.bills).

En esta página