【问题标题】:How can I use multiple debounceTime on one Observable?如何在一个 Observable 上使用多个 debounceTime?
【发布时间】:2016-11-28 22:11:39
【问题描述】:

我有一个输入 html 元素并使用 Observables 执行基本类型提前搜索功能:

代码:

   @Output() keywordChange = new EventEmitter();

   this.keyword$ = Observable.fromEvent(myInput, 'keyup');
    this.keyword$
      .map((event: any) => event.target.value)
      .debounceTime(200)
      .subscribe(keyword => this.keywordChange.emit(keyword));

所以基本上我会捕获在每个键位之间至少有 200 毫秒键入的任何关键字。

现在我想保存用户在 cookie 中搜索的任何内容,以便向他们显示“您的最新搜索”,但我想在保存前等待 3000 毫秒 输入的值。

我知道下面的代码行不通,但只是为了说明,我想实现与此类似的东西:

    this.keyword$
      .map((event: any) => event.target.value)
      .debounceTime(200)
      .subscribe(keyword => this.keywordChange.emit(keyword))
      .debounceTime(3000)
      .subscribe(keyword => addKeyWordToLatestSearches(keyword));

这是否有可能以某种方式链接操作员以不同的去抖动时间执行多项操作?

【问题讨论】:

    标签: angular rxjs angular2-observables


    【解决方案1】:

    您是否可能希望share 初始订阅有可能以两种独立的方式处理发出的数据?由于您不想在原始源上订阅两次,您可以使用 RxJS 的share operator

    const keyupValue$ = this.keyword$
      .map((event: any) => event.target.value)
      .share();
    
    keyupValue$
      .debounceTime(200)
      .subscribe(keyword => this.keywordChange.emit(keyword))
    
    keyupValue$ 
      .debounceTime(3000)
      .subscribe(keyword => addKeyWordToLatestSearches(keyword));
    

    【讨论】:

    • 本例中不使用share会有什么后果?我试过了,看起来你的例子即使没有 share() 也能工作。共享是否只是让我只需要跟踪一个订阅而不是多个订阅?
    • share() 使您的流多播,因此两个订阅都指向同一个源。由于其简单性,您的示例将在没有 share() 的情况下工作。当您开始有大量资源订阅(db 调用、http 调用等)时,share() 是要走的路
    • 这真的取决于你的源 observable。但是例如,当使用 angular 2 http API 并在不共享的情况下执行此操作时,每个订阅者都会触发自己的 http 请求。因此,share 方法创建了一个主题,您可以将其视为订阅者和 observable 的组合,它通过重用原始流的事件来处理多个订阅者。
    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多