javascript - node - ¿Versión prometedora de un ciclo "while"?
callback to promise bluebird (1)
Siento que algo debería ser posible usando la recursión
Exactamente. Puede asignar un nombre a la devolución de llamada para que pueda consultarla nuevamente. Mientras la condición no se cumpla, devuelve una promesa de la devolución de llamada. De lo contrario, devuelve el resultado final:
getDataFromAPI(offset)
.then(function next(newData){
data.concat(newData);
var newOffset = data.length;
return newOffset < total ? getDataFromAPI(newOffset).then(next) : data;
})
.then(function(data) {
console.log(data); // final result
});
Llegué a la conclusión de que, dado que las promesas en ECMAScript 6 permiten la codificación sincrónica de funciones asíncronas, por cada pieza de código llena de promesas hay un corolario sincrónico. Por ejemplo:
var data = processData(JSON.parse(readFile(getFileName())));
Es lo mismo que:
var data = getFileName()
.then(readFile)
.then(JSON.parse)
.then(processData);
Ahora, para mi caso de uso actual, quiero escribir código para extraer datos de una API pública masiva. La API está paginada, por lo que en un mundo puramente sincrónico escribiría algo como lo siguiente:
var data = [];
var offset = 0;
var total = 10000; // For example - not actually how this would work
while( offset < total ) {
data.concat(getDataFromAPI(offset));
offset = data.length;
}
Ahora mi pregunta es, ¿cómo haría esto con promesas? Podría escribir algo como:
var data = [];
var offset = 0;
var total = 10000;
getDataFromAPI(offset)
.then(function(newData){
data.concat(newData);
return getDataFromAPI(data.length);
});
Pero en este punto me veo obligado a encadenar infinito. .then
s - no hay lógica de bucle. Siento que algo debería ser posible usando la recursión, pero no tengo idea de cómo hacerlo.
Estoy usando BluebirdJS como mi biblioteca de promesas, así que tengo acceso a todos sus métodos de ayuda.