Maneira correta de passar dados de um observável para outro

Avinash Kumar

Eu tenho duas APIs HTTP -

  1. Obtém uma lista de tableNames
  2. Obtém uma lista de metadados

Estou trabalhando em um aplicativo Angular 5 onde os metadados (da 2ª API) antes de serem exibidos devem ser modificados usando os nomes das tabelas (da 1ª API).

Portanto, vejo a tarefa da seguinte maneira:
tenho dois observáveis. O primeiro observável conecta-se ao tableNames APIe traz tableNames. O segundo observável se conecta ao metadata API, traz metadados e modifica os metadados de acordo com a tableNames APIsaída. Gostaria de manter o produto final (metadados modificados) como um observável que o aplicativo angular pode assinar.

Atualmente, o código parece algo como abaixo-

private tablesNames: ReadonlyArray<String> | undefined;

this.getTablesNamesObservable().subscribe(
      tablesNames => { this.tablesNames = tablesNames; }
    );

// modify metadata uses tableNames to modify the metadata
this.modifiedMetadataObservable = this.metadataService.getOperatorMetadata()
                                      .map(metadata => this.modifyMetadata(metadata));

Não me senti bem com o código, pois estava assumindo a sincronia entre duas operações assíncronas. A dúvida foi comprovada logo após a leitura deste artigo . Portanto, usando a abordagem sugerida no artigo, alterei o código para fornecer tableNames como um parâmetro para gerar novos Observables e usar switchMap (eu poderia ter usado concatMap / flatMap, mas switchMap atendeu aos meus requisitos).

this.getTablesNamesObservable().switchMap(
      tableNames =>{this.metadataService.getOperatorMetadata()
                        .map(metadata => this.modifyMetadata(metadata, tableNames));}
      );

É esta a forma correta de realizar esta tarefa ou existem outras técnicas melhores para o conseguir?

cartant

Se getTablesNamesObservablee getOperatorMetadataforem independentes, faria mais sentido usar combineLatest:

Observable.combineLatest(
  this.getTablesNamesObservable(),
  this.metadataService.getOperatorMetadata()
).map(([tableNames, metadata]) => this.modifyMetadata(metadata, tableNames));

Em seguida modifyMetadata, será chamado sempre que qualquer um dos observáveis ​​emita um valor.

Ao usar switchMap, você cancela e renova a assinatura do observável retornado por getOperatorMetadatasempre que o observável retornado por getTablesNamesObservableemitir. E se eles forem independentes - isto é, getOperatorMetadatanão precisam passar os nomes das tabelas - fazer parece desnecessário.

Se cada um dos observáveis ​​emitir apenas um único valor - ou se você quiser apenas o último valor emitido de cada um - use em forkJoinvez de combineLatest.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Maneira correta de passar o estado de um componente para outro

swift - maneira correta de passar dados para UICollectionViewCell

Existe uma maneira correta de passar dados para um componente React a partir da página HTML?

Maneira correta de passar protótipo para um objeto

Maneira correta de encerrar um fluxo observável com erro

Maneira correta de passar um ponteiro? c ++

A maneira correta de passar a cadeia de conexões da inicialização para qualquer outro controlador

Maneira correta de manter o banco de dados gravável para um aplicativo

No Angular 8, como passar dados dinâmicos de um observável para um diálogo modal?

No Angular 8, como passar dados dinâmicos de um observável para um diálogo modal?

Maneira correta de ler dados para um gráfico

Qual é a maneira correta de alocar dados para passar para uma chamada FFI?

Maneira correta de passar dados de nodejs para angular em nwjs (node-webkit)

Como passar dados de um arquivo para outro em python?

Como passar dados de um componente para outro componente

Como passar dados de um componente para outro ReactJS

Como passar dados de um componente para outro componente

Como passar dados em array de um vc para outro?

Passar dados API de um componente para outro componente?

Como passar dados de um modelo para outro em Swift?

Como passar dados para um widget dentro de outro widget

ReactJs: Como passar dados de um componente para outro?

Como passar dados de um controlador para outro no CakePHP 3?

Como passar dados de um fragmento para outro - android

Como passar dados de um componente para outro no arquivo ts?

Passar dados de um ViewModel para outro no SwiftUI?

Maneira correta de passar um link para um modelo de e-mail no Django

Qual é a maneira correta de passar um Sprite para um filtro de deslocamento?

Qual é a maneira correta de passar um token de cancelamento para um fluxo assíncrono?

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo