私は2つのHTTPAPIを持っています-
表示される前のメタデータ(2番目のAPIから)をテーブル名(1番目のAPIから)を使用して変更する必要があるAngular5アプリケーションに取り組んでいます。
したがって、タスクは次のよう
になります。2つのオブザーバブルがあります。最初のobservableはに接続し、tableNames API
tableNamesをもたらします。2番目のオブザーバブルはに接続しmetadata API
、メタデータを取得し、tableNames API
出力に従ってメタデータを変更します。最終製品(変更されたメタデータ)を、Angularアプリケーションがサブスクライブできるオブザーバブルとして保持したいと思います。
現在、コードは次のようになっています-
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));
2つの非同期操作間の同期を想定していたため、コードに満足できませんでした。この記事を読んだ直後に疑いが証明されました。そのため、記事で提案されているアプローチを使用して、新しいObservableを生成し、switchMapを使用するためのパラメーターとしてtableNamesを指定するようにコードを変更しました(concatMap / flatMapを使用することもできましたが、switchMapは要件に適合しました)。
this.getTablesNamesObservable().switchMap(
tableNames =>{this.metadataService.getOperatorMetadata()
.map(metadata => this.modifyMetadata(metadata, tableNames));}
);
これはこのタスクを実行する正しい方法ですか、それともこれを達成するための他のより良いテクニックがありますか?
getTablesNamesObservable
とgetOperatorMetadata
が独立している場合は、次を使用する方が理にかなっていますcombineLatest
。
Observable.combineLatest(
this.getTablesNamesObservable(),
this.metadataService.getOperatorMetadata()
).map(([tableNames, metadata]) => this.modifyMetadata(metadata, tableNames));
次にmodifyMetadata
、いずれかのobservableが値を発行するたびに呼び出されます。
を使用するとswitchMap
、によって返されるオブザーバブルが発行さgetOperatorMetadata
れるたびに、によって返されるオブザーバブルのサブスクライブを解除して再サブスクライブしますgetTablesNamesObservable
。そして、それらが独立している場合、つまりgetOperatorMetadata
テーブル名を渡す必要がない場合は、そうする必要はないようです。
オブザーバブルがそれぞれ単一の値のみを出力する場合、またはそれぞれの最後に出力された値のみが必要な場合は、のforkJoin
代わりにを使用しますcombineLatest
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加