2016-11-28 13 views
2

我有一个输入HTML元素做一个基本型使用观测量向前搜索功能:如何在一个Observable上使用多个debounceTime?

代码:

@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毫秒键入的关键字KEYUP。

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

我知道下面的代码将无法正常工作,但只是为了说明问题,我想实现这个类似的东西:

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

这可能在某种程度上,链接运营商做多件事情有不同的debounceTimes?

回答

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)); 
+1

在这个例子中不使用共享的后果是什么?我试了一下,似乎你的例子,即使没有共享()。共享是否只是让我只需要跟踪一个订阅而不是多个订阅? – Weblurk

+0

'share()'使您的流多播因此这两个订阅都是相同的来源。由于其简单性,您的示例将不使用'share()'而工作。当你开始有大量资源订阅(db调用,http调用等)'share()'是要走的路 –

+0

这真的取决于你的源observable。但是,例如,当使用角度为2的http API并在不共享的情况下执行此操作时,每个用户都会触发自己的http请求。所以'share'方法创建了一个你可以认为是用户和观察者的组合的主体,它通过重用原始流的事件来处理多个用户。 –

相关问题