簡単な答えは次のとおりです。いくつかの回避策を実装できますが、これは本当に見苦しいので、なぜこれが必要なのか、アーキテクチャを変更できるかどうか、ユースケースを再考することをお勧めします。また、関数の最初の実行は、3 つのオブザーバブルすべてが少なくとも 1 つの値を発行した後であることに注意してください。
とにかく - 考えられる回避策は次のとおりです。
let trigger = "";
Observable.combineLatest(
this.tournamentsService.getUpcoming().do(() => trigger = "tournament"),
this.favoriteService.getFavoriteTournaments().do(() => trigger = "favTournament"),
this.teamsService.getTeamRanking().do(() => trigger = "teamRanking"),
(tournament, favorite, team) => {
console.log(`triggered by ${trigger}`);
}).subscribe();
どのオブザーバブルがトリガーされたかに基づいて特定の操作を実行する場合は、各オブザーバブルを利用し、それらを個別のトリガーとして利用して、組み合わせたトリガーに切り替える必要があります。コードが少し増えるかもしれませんが、はるかにクリーンで、醜いif/else、switch/case-messに終わり、いくつかのハッキーな回避策があります-さらにasync
、すべてを手動でサブスクライブしてローカル変数を更新する代わりに、-pipeを使用する機会さえあります(これはとにかく悪い習慣です) :
これがどのように見えるかのコード例を次に示します。
let upcoming$ = this.tournamentsService.getUpcoming();
let favorite$ = this.favoriteService.getFavoriteTournaments();
let rankings$ = this.teamsService.getTeamRanking();
let allData$ = Observable.combineLatest(
upcoming$, favorite$, rankings$,
(tournament, favorite, team) => {
return {tournament, favorite, team};
}
);
// initial call -> this SHOULD be redundant,
// but since I don't know your code in detail
// i've put this in - if you can remove it or not
// depends on the order your data coming in
allData$
.take(1)
.do(({tournament, favorite, team}) => {
this.displayMatches(...);
this.sortByFavorites(...);
this.fillWithRanking(...);
})
.subscribe();
// individual update triggers
upcoming$
.switchMapTo(allData$.take(1))
.do(({tournament, favorite, team}) => this.displayMatches(...))
.subscribe();
favorite$
.switchMapTo(allData$.take(1))
.do(({tournament, favorite, team}) => this.sortByFavorites(...))
.subscribe();
rankings$
.switchMapTo(allData$.take(1))
.do(({tournament, favorite, team}) => this.fillWithRanking(...))
.subscribe();