Skip to content

Instantly share code, notes, and snippets.

@angelorubin
Forked from neves/async-concat.js
Created October 16, 2018 18:31
Show Gist options
  • Save angelorubin/94a582e42e52afcf85e0ee77346c6803 to your computer and use it in GitHub Desktop.
Save angelorubin/94a582e42e52afcf85e0ee77346c6803 to your computer and use it in GitHub Desktop.
Concatenação de resultado paginado de API
/*
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