Estoy tratando de obtener todos los registros de una API remota que tiene una limitación sobre cuántos se pueden obtener a la vez. Estoy tratando de usar la recursión, pero la idea general de lo que funciona en Python no puedo trabajar también en JS.
Esto es lo que estoy haciendo actualmente, y obtendrá 100 registros, pero luego continúa en segundo plano. He intentado muchas formas diferentes de hacerlo y nada parece funcionar como se esperaba.
Cualquier ayuda sería genial, gracias.
async getBooks(offset = 0) { return await bookGenie.find( 'fiction', 100, offset, ) }Sugiero este:
async function getBooks(offset = 0, result = []) { try { // get new page const page = await bookGenie.find( 'fiction', 100, offset, ); // add page to result array result = result.concat(page); // check is this the end if (page.length !== 100) { // or what condition do you need // return result array return result; } else { // or increase offset and continue processing return getBooks(offset + 100, result); } } catch (err) { throw err; // or handling somehow } } Ahora getBook recursivo devuelve la promesa con todos los registros encontrados combinados en una matriz en la resolución y arroja un error en el rechazo.
Todas las solicitudes se ejecutarán una por una, aumentando el desplazamiento en 100 en cada paso hasta que la solicitud devuelva menos de 100 registros (página no completa = final de la lista).
Uso:
const list = await getBooks(); console.log(list); // [ ... ] // List of all recordsExtra: mismo método pero compacto
async function getBooks(offset = 0, result = []) { try { const page = await bookGenie.find('fiction', 100, offset); return page.length !== 100 ? result.concat(page) : getBooks(offset + 100, result.concat(page)); } catch (err) { throw err; // or handling somehow } }Su llamada await getBooks() :
getBooks((offset = offset += 100))probablemente debería escribirse como:
getBooks((offset += 100))Y la declaración if anterior me parece incorrecta. Tal vez intente:
if (result.length < 1000) { // will continue until result.length is 1000 result.push(await getBooks(offset += 1)); /* + 1 so the .push will add one element to the array each time. + 100 may work too */ }En realidad, no pude probar esto, pero esto (o algo similar a esto) es más convencional para JS. Aquí hay un enlace que podría ayudarlo https://www.javascripttutorial.net/javascript-recursive-function/