【问题标题】:RxJs: Emit each value of a sequence separatelyRxJs:分别发出一个序列的每个值
【发布时间】:2016-11-04 14:07:17
【问题描述】:

RxJs、Typescript 1.8 和 Angular2。

我有一个返回 Observable 的函数。 Observable 调用一个 Web API,它返回一个对象序列。这是我的实际代码:

  getClients(): Observable<IClient[]> {
    return this.backendService.get(`tracker/clients`)
      .map((resp: {}[]) => { return _.map(resp, createClientFromJson)})
      .map((clients: IClient[]) => {
        this.logger.debug(`Created ${clients.length} Clients from reply`);
        return clients;
      });
  }

backendService.get() 的调用最终调用http.get(),它返回一个Observable

我的代码使用 Observable 中的事件:

  loadClients() {
    this.getClients().subscribe((clients: IClient[]): void => {
      this.clients = this.clients.concat(clients);
      this.logger.debug(`Got ${clients.length} clients, now have ${this.clients.length}.`);
    })
  }

这一切都有效。然而,我的 Observable 发出一次 - 带有 N 个元素的序列。如果 Web API 返回一个包含 20 项的序列,则只有 1 个事件将发送到 loadClients()

我怎样才能使序列中的每个项目都自己发出,而不是一次发出整个序列?

在我的程序的某些部分,我需要整个序列。在其他情况下,我需要寻找一个符合某些标准的特定元素。

【问题讨论】:

    标签: angular typescript rxjs observable


    【解决方案1】:

    试试这个

    this.getClients().flatMap(clients => Observable.from(clients)).subscribe(client => {
       // do something with client
    })
    

    【讨论】:

    • 这会导致Observable&lt;IClient&gt; 还是Observable&lt;Observable&lt;IClient&gt;&gt;?我问是因为我尝试了一些类似的东西,但它导致了一个 observable-of-observable,这很难处理。
    • 随便flatMap(clients =&gt; clients)
    • 我最终选择了flatMap(clients =&gt; clients),而不是Observable.from(...)
    • @John,如果您使用 map 而不是 flatMap 又名 concatMap,它将导致嵌套的 observable。它具有将内部可观察对象奉承到价值的能力
    【解决方案2】:
    this.getClients().switch(v => v).subscribe(clients => {
      // your original code 
    });
    

    【讨论】:

    • 这很好知道,但在我的用例中,我正在实现一个函数getEachClient(),它应该自己发出每个IClient。使用 switch 将(似乎)导致每个 IClient 在其自己的 1 元素序列中发出。使用 flatMap 似乎更适合我的用例。
    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多