-
-
Save angelorubin/94a582e42e52afcf85e0ee77346c6803 to your computer and use it in GitHub Desktop.
Concatenação de resultado paginado de API
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
/* | |
Tempo esperado para resolver: 30 minutos | |
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. | |
6) Faça uma cópia em um gist privado (secreto) e envie o link por email. | |
7) Modifique apenas a linha @TODO. | |
*/ | |
// Cria uma resposta falsa para testar localmente | |
function buildFakeResult(page) { | |
if (page > 4) { | |
return [] | |
} else { | |
return [ | |
{ | |
product: `Nome do Produto ${page * 2 - 1}`, | |
price: page * 7.50 + 3.21 | |
}, | |
{ | |
product: `Nome do Produto ${page * 2}`, | |
price: page * 7.50 + 2.59 | |
} | |
] | |
} | |
} | |
// 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)) | |
} | |
// Função que concatena o resultado de todas as páginas | |
function concatenateResults(callback, page = 1) { | |
// @TODO: implementar esta função | |
} | |
// Para utilizar, basta passar como parâmetro a função que retorna os dados paginados | |
concatenateResults(listWithPagination) | |
.then(data => console.log(data)) | |
/* | |
Executar utilizando node async-concat.js | |
saída esperada: | |
[ { product: 'Nome do Produto 1', price: 10.71 }, | |
{ product: 'Nome do Produto 2', price: 10.09 }, | |
{ product: 'Nome do Produto 3', price: 18.21 }, | |
{ product: 'Nome do Produto 4', price: 17.59 }, | |
{ product: 'Nome do Produto 5', price: 25.71 }, | |
{ product: 'Nome do Produto 6', price: 25.09 }, | |
{ product: 'Nome do Produto 7', price: 33.21 }, | |
{ product: 'Nome do Produto 8', price: 32.59 } ] | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment