Paginación
Una página, todas las páginas o un elemento cada vez.
Una página
var page = await client.Threads.ListAsync(folder: "inbox", limit: 25); foreach (var thread in page){ Console.WriteLine(thread["id"]);} if (page.HasMore){ var next = await client.Threads.ListAsync(folder: "inbox", limit: 25, cursor: page.NextCursor); Console.WriteLine(next.Count);}Un método ListAsync devuelve una Page con Items, HasMore y NextCursor, y foreach recorre sus elementos. Vuelve a pasar NextCursor como cursor:, con los mismos filtros, para leer la página siguiente.
Todas las páginas
var failed = await client.Emails.ListAllAsync(status: new[] { "failed" }); Console.WriteLine($"{failed.Count} messages failed");Un método ListAllAsync sigue el cursor hasta el final y devuelve todos los elementos en una sola lista. Un fallo en cualquier página hace fallar toda la llamada.
Un elemento cada vez
await foreach (var contact in client.Contacts.IterateAsync(limit: 100)){ if ((string?)contact["email"] == "[email protected]") { break; }} await foreach (var entry in client.Emails.IterateEventsAsync("msg_3f9a1c07d2b84e6a9c5b1f20")){ Console.WriteLine(entry["type"]);}Un método IterateAsync devuelve un IAsyncEnumerable<JsonObject>, que pide la página siguiente solo cuando el bucle llega a ella, así que un break detiene las peticiones. Cada lista que pagina tiene los tres, con el nombre de la lista que recorren: ListAllEventsAsync e IterateEventsAsync junto a ListEventsAsync.
Un recorrido se detiene cuando la API repite un cursor que ya ha seguido, así que nunca puede dar vueltas sin fin.