Skip to content

Instantly share code, notes, and snippets.

@neves
Last active November 10, 2018 11:43
Show Gist options
  • Save neves/588762d17bf50d4362c7e6d259ac8d31 to your computer and use it in GitHub Desktop.
Save neves/588762d17bf50d4362c7e6d259ac8d31 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) Não é permitido criar funções ou variáveis globais (fora da função concatenateResults).
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) Enviar duas soluções, uma utilizando async/await e outra utilizando apenas Promise
7) Faça uma cópia em um gist privado (secreto) para cada solução e envie o link com a solução por email.
*/
// 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) {
// @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