Last active
July 9, 2019 19:57
-
-
Save LukasTsunami/b8a3d47770807f82855558b1e2794c34 to your computer and use it in GitHub Desktop.
Lendo paginas de um livro de forma assincrona
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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