将Observable的Observable转换为简单的Observable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Observable的Observable转换为简单的Observable相关的知识,希望对你有一定的参考价值。

我是rxjs的新手,已阅读了十几个教程,但它仍然令人困惑。假设我有一个用户ID列表,每3秒我想从REST服务查询每个用户的一些数据(在线游戏匹配信息)。多个用户可能玩过相同的匹配,因此getLastMatch()可能会为不同的用户返回相同的匹配ID。我想按匹配ID对结果流进行分组。因此,对于用户1,我得到匹配ID 101,2 - > 100和3 - > 101.我希望我的observable发出像

{
    [
    {"match": 101, "players": [1, 3]},
    {"match": 100, "players": [2]},
    ]
}

这是我到目前为止提出的代码,但是我坚持使用生成Observable <Observable <MatchData >>的最后一行

class MatchData{
  constructor(public matchId: number, public won: boolean) {}
}

const players = [1, 2, 3];

function getLastMatch(userId: number): Observable<MatchData> {
  let data = new MatchData(100 + userId % 2, userId % 2 == 0);
  return Observable.fromPromise(new Promise<MatchData>(resolve => resolve(data))));
}

const scheduler = Observable.interval(3000);
scheduler.map(Observable.from(players.map(p => getLastMatch(p))));

UPD:

这就是我最终的结果。

class MatchData {
  constructor(public playerId: number, public matchId: number) {}
}

class GroupedMatchData {
  constructor(public matchId: number, public playerIds: number[]) {}
}

const accounts = [1, 2, 3];
const scheduler = Observable.interval(3000);

function getMatch(id: number): Observable<MatchData> {
  let promise = new Promise<MatchData>(resolve => resolve(new MatchData(id, 100 + id % 2)));
  return Observable.fromPromise(promise);
}

function requestMatchData(): Observable<GroupedMatchData> {
  return Observable.from(accounts.map(account => getMatch(account)))
    .mergeAll()
    .groupBy(match => match.matchId, match => match.playerId)
    .flatMap(group => group.reduce((accumulator, current) => [...accumulator, current], [group.key]))
    .map(array => new GroupedMatchData(array[0], array.slice(1)));
} 

scheduler.take(1).flatMap(requestMatchData).subscribe(console.log);

对我的解决方案的任何评论表示赞赏

以上是关于将Observable的Observable转换为简单的Observable的主要内容,如果未能解决你的问题,请参考以下文章

RxJS:如何将 Observable<Observable<Thing>> 转换为 Observable<Thing[]>

Angular 2:将 Observable 转换为 Promise

Spring Boot 2 - 将 Mono 转换为 rx.Observable?

Dart:将 Observable 转换为 Future,反之亦然?

如何将 RxSwift 的 Single 转换为 Observable 并忽略“完成”事件?

RxSwift 将 Observable<String> 转换为 String