【问题标题】:RXJS Emit first result and then wait for another observableRXJS 发出第一个结果,然后等待另一个 observable
【发布时间】:2017-05-18 22:37:59
【问题描述】:

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

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

我还试图在输入的文本上实现去抖动。

我整理了一些无法解释的东西。就目前而言,它仅在我开​​始输入文本后才显示客户端。

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));
          });
      });

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    你需要将你的 observables 合并在一起:

    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 中来将它们扁平化。

    [source]

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

    【讨论】:

    • 哇错过了这么小的东西!谢谢
    • 我刚刚检查过,承诺只创建一次,即使没有共享。 IE 不会多次访问服务器。
    • 哦对了,没想到是fromPromise,promise 是热门的 observables,所以没必要分享,确实....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2021-08-28
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2022-01-13
    相关资源
    最近更新 更多