Estou começando a usar o RxJS e não entendo porque neste exemplo precisamos usar uma função como flatMap
ou concatAll
; onde está a matriz de matrizes aqui?
var requestStream = Rx.Observable.just('https://api.github.com/users');
var responseMetastream = requestStream
.flatMap(function(requestUrl) {
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
});
responseMetastream.subscribe(url => {console.log(url)})
Se alguém puder explicar visualmente o que está acontecendo, será muito útil.
javascript
rxjs
user233232
fonte
fonte
flatMap
tivesse sido nomeadomapThenFlatten
, seria menos confuso.Respostas:
Quando comecei a olhar
Rxjs
também tropecei naquela pedra. O que me ajudou foi o seguinte:flatMap
: http://reactivex.io/documentation/operators/flatmap.htmlflatMap
lá, você deve olhar paramergeMap
(outro nome).finalmente olhando para as informações de tipo do RxJava. Javascript não está sendo digitado não ajuda aqui. Basicamente, se
Observable<T>
denota um objeto observável que empurra valores do tipo T, entãoflatMap
pega uma função do tipoT' -> Observable<T>
como seu argumento e retornaObservable<T>
.map
recebe uma função de tipoT' -> T
e retornaObservable<T>
.Voltando ao seu exemplo, você tem uma função que produz promessas a partir de uma string de url. Então
T' : string
, eT : promise
. E pelo que dissemos antespromise : Observable<T''>
, entãoT : Observable<T''>
, comT'' : html
. Se você colocar essa função de produção de promessamap
, obteráObservable<Observable<T''>>
quando o que quiser éObservable<T''>
: você deseja que o observável emita oshtml
valores.flatMap
é chamado assim porque nivela (remove uma camada observável) do resultadomap
. Dependendo da sua formação, isso pode parecer chinês para você, mas tudo ficou claro para mim com a digitação das informações e o desenho aqui: http://reactivex.io/documentation/operators/flatmap.html .fonte
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
areturn jQuery.getJSON(requestUrl);
comoflatMap
também aceita a função de seletor que retorna uma função promessa ou seja, do tipoT' -> Promise
.T’ -> T
:? Eu entendo oT
como um genérico, mas o que é apóstrofo e seta não gorda?Você usa flatMap quando tem um Observable cujos resultados são mais Observables.
Se você tiver um observável que é produzido por outro observável, não poderá filtrar, reduzir ou mapeá-lo diretamente porque você tem um Observável e não os dados. Se você produzir um observável, escolha flatMap em vez de mapa; então você está bem.
Como no segundo trecho, se você estiver fazendo uma operação assíncrona, precisará usar flatMap.
fonte
flatMap
transforma os itens emitidos por um Observável em novos Observáveis e, em seguida, nivela as emissões desses em um único Observável.Verifique o cenário abaixo, onde
get("posts")
retorna um Observable que é "nivelado" porflatMap
.fonte
As pessoas tendem a complicar demais as coisas , dando a definição que diz:
Juro que esta definição ainda me confunde, mas vou explicá-la da maneira mais simples que é usando um exemplo
Nossa situação : temos um observável que retorna dados (URL simples) que usaremos para fazer uma chamada HTTP que retornará um observável contendo os dados de que precisamos para que você possa visualizar a situação assim:
como você pode ver, não podemos alcançar os dados de que precisamos diretamente, então a primeira maneira de recuperar os dados podemos usar apenas assinaturas normais como esta:
isso funciona, mas como você pode ver, temos que aninhar assinaturas para obter nossos dados, isso atualmente não parece ruim, mas imagine que temos 10 assinaturas aninhadas que se tornariam impossíveis de manter.
então, a melhor maneira de lidar com isso é usar o operador
flatMap
que fará a mesma coisa, mas nos faz evitar essa assinatura aninhada:fonte
Simples:
fonte
Não é uma matriz de matrizes. É um observável de observável (s).
O seguinte retorna um fluxo observável de string.
Enquanto isso retorna um fluxo observável de fluxo observável de json
flatMap
nivela o observável automaticamente para nós, para que possamos observar o fluxo json diretamentefonte
flatMap
(emap
) não são especiais para matrizes. É possível definir essas operações em qualquer container ou wrapper genérico, incluindo arrays, dicionários, "opcionais", fluxos reativos, promessas, ponteiros e até as próprias funções. Esta é uma propriedade emergente de uma construção matemática chamada mônada. Todos os exemplos acima atendem aos requisitos para ser uma mônada e, portanto, todos podem receber uma definição demap
e aflatMap
(com algumas ressalvas).Aqui, para mostrar a implementação equivalente de um flatMap usando assinantes.
Sem flatMap:
Com flatMap:
http://plnkr.co/edit/BHGmEcdS5eQGX703eRRE?p=preview
Espero que possa ajudar.
Olivier.
fonte
Um Observable é um objeto que emite um fluxo de eventos: Next, Error e Completed.
Quando sua função retorna um Observable, ela não está retornando um stream, mas uma instância de Observable. O
flatMap
operador simplesmente mapeia essa instância para um fluxo.Esse é o comportamento de
flatMap
quando comparado amap
: Executar a função fornecida e nivelar o objeto resultante em um fluxo.fonte
Com flatMap
Sem flatMap
fonte
Eu não sou estúpido, mas tive que ler isso 10 vezes e ainda não entendi. Quando leio o snippet de código:
então eu pude entender o que está acontecendo, ele faz duas coisas:
*) A palavra de transformação diz que o item pode ser transformado em outra coisa.
Em seguida, o operador de mesclagem fica claro para, ele faz o achatamento sem o mapeamento. Por que não chamá-lo de mergeMap ? Parece que também existe um mergeMap Alias com esse nome para flatMap .
fonte