Eu tenho duas APIs HTTP -
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 API
e traz tableNames. O segundo observável se conecta ao metadata API
, traz metadados e modifica os metadados de acordo com a tableNames API
saí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?
Se getTablesNamesObservable
e getOperatorMetadata
forem 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 getOperatorMetadata
sempre que o observável retornado por getTablesNamesObservable
emitir. E se eles forem independentes - isto é, getOperatorMetadata
nã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 forkJoin
vez de combineLatest
.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras