RXJS发出第一个结果,然后等待另一个可观察的结果

时间:2017-05-18 14:17:07

标签: angular rxjs

目前我有两个可观察者。一个返回客户端列​​表,另一个在文本更改时触发。

我想发出客户端的完整结果,然后在用户开始过滤后切换到内部observable。

我也试图对所输入的文字进行辩解。

我把一些无法尝试解释的东西放在一起。目前它只在我开始输入文本时显示客户端。

let obs = Observable.fromPromise(this.clientService.getClients())
      .map((clients) => {
        return clients.map((c) => new Client().fromObject(c));
      });

    this.clients = obs.switchMap((values) => {
        return this.searchText.valueChanges
          .debounceTime(400)
          .distinctUntilChanged()
          .map((text) => {
            return values.filter((c) => c.isMatch(text));
          });
      });

1 个答案:

答案 0 :(得分:2)

你需要将你的观察者合并在一起:

let obs = Observable.fromPromise(this.clientService.getClients())
      .map((clients) => {
        return clients.map((c) => new Client().fromObject(c));
      }).share();

let filtered = obs.switchMap((values) => {
    return this.searchText.valueChanges
        .debounceTime(400)
        .distinctUntilChanged()
        .map((text) => {
        return values.filter((c) => c.isMatch(text));
        });
    });

this.clients = Observable.merge(obs,filtered);

首先,您需要使用share运算符来避免两次提取客户端(请参阅进一步编辑)。那么您需要从obsfiltered获取值。这是merge的用途:

  

创建一个输出Observable,它同时发出每个给定输入Observable的所有值。

     
    

通过将多个Observable的值混合到一个Observable中来展平它们。

  
     

enter image description here

[source]

编辑:在这种特定情况下,share部分不是必需的,因为OP使用promise作为可观察源,承诺不会被订阅触发,它们是{{3并且不需要共享。但是,如果您正在处理其他可观察的来源(如角度Http服务的方法,则可能需要share