Last active
October 16, 2020 20:11
-
-
Save matheusazzi/f056e6f35756d026a7f2 to your computer and use it in GitHub Desktop.
promise-observer.js
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
function RenderAndOrderByName() { console.log('Ordenado por nomes') } | |
function RenderAndOrderByAge() { console.log('Ordenado por idades') } | |
// Retorna uma Promise | |
function getUsers() { | |
// Apenas faz um request para uma lista de users, | |
// a ordenação é feita no client | |
} | |
// Depois que a promise terminar, ordena eles por nome. | |
getUsers().then((data) => RenderAndOrderByName(data)) | |
// Opa... o usuário mudou de ideia, agora é pra ordenar por idade. | |
// A promise ainda não terminou, então quando ela terminar eu devo | |
// executar apenas o RenderAndOrderByAge e não ordenar mais por nome (RenderAndOrderByName) | |
// Ou seja, cancelar o comportamento anterior e adicionar um novo | |
// aproveitando o mesmo request e sem ter que guardar nenhum estado | |
// O setTimeout é apenas para simular que o usuário mudou de ideia após um tempo | |
// mas antes da requisição ser finalizada. | |
setTimeout(() => { | |
getUsers().then((data) => RenderAndOrderByAge(data)) | |
}, 100) | |
// Para resolver isso com aquelas restrições vai ser preciso um workaround bem grande, | |
// porém você pode combinar Promises com Observables e resolver essa tarefa de | |
// forma muito simples: | |
const promise$ = Rx.Observable.fromPromise(getUsers()) | |
const byName = promise$.subscribe((data) => RenderAndOrderByName(data)) | |
setTimeout(() => { | |
byName.dispose() | |
const byAge = promise$.subscribe((data) => RenderAndOrderByAge(data)) | |
}, 100) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment