Skip to content

Instantly share code, notes, and snippets.

@LukasTsunami
Last active July 9, 2019 19:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LukasTsunami/b8a3d47770807f82855558b1e2794c34 to your computer and use it in GitHub Desktop.
Save LukasTsunami/b8a3d47770807f82855558b1e2794c34 to your computer and use it in GitHub Desktop.
Lendo paginas de um livro de forma assincrona
/*
Descrição do problema:
Temos uma função chamada listWithPagination que retorna um array de registros paginados.
A única maneira de conseguir um array com todos os registros,
é fazer requisições sequenciais para cada página, concatenando os resultados.
Descrição da solução:
Criar uma função chamada concatenateResults, que receba como parâmetro a função original
que retorna os dados paginados, e chama essa função sequencialmente para cada página,
até que a resposta seja um array vazio, o que indica que a paginação terminou.
Retornar uma Promise que resolve com um array contendo todos as páginas concatenadas.
Tarefa:
Baseado na solução acima, implementar o corpo da função abaixo concatenateResults.
1) Não é permitido modificar nenhuma outra função.
2) Não é permitido fazer require de outro módulo.
3) Pode-se criar funções auxiliares se preciso, mas não crie variáveis no escopo global.
4) O mais importante é clareza e simplicidade do código.
5) A quantidade de páginas é desconhecida, por isso a solução precisa funcionar para "n" páginas,
a única maneira de saber que não tem mais páginas é o fato de retornar um array vazio.
*/
function buildFakeResult(page) {
if (page > 3) {
return []
} else {
return [
{page: `${page}.1`},
{page: `${page}.2`}
]
}
}
// Função falsa para simular uma requisição,
// Um array vazio representa o fim da paginação
function listWithPagination(page) {
return Promise.resolve(buildFakeResult(page))
}
function isAnEmptyArray(some_array){
return (typeof some_array != undefined) && (some_array.length===0)
}
// Função que concatena o resultado de todas as páginas
function concatenateResults(callback, page = 1) {
return callback(page).then((result) => {
if(isAnEmptyArray(result)) return [];
return concatenateResults(callback, page + 1).then((next_result) => result.concat(next_result));
});
}
concatenateResults(listWithPagination).then((data) => console.log(data));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment