As pessoas tendem a complicar demais as coisas , dando a definição que diz:
flatMap transforma os itens emitidos por um Observável em Observáveis e, em seguida, aplaina as emissões desses em um único Observável
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:
Observable 1
|_
Make Http Call Using Observable 1 Data (returns Observable_2)
|_
The Data We Need
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:
Observable_1.subscribe((URL) => {
Http.get(URL).subscribe((Data_We_Need) => {
console.log(Data_We_Need);
});
});
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:
Observable_1
.flatMap(URL => Http.get(URL))
.subscribe(Data_We_Need => console.log(Data_We_Need));