根据条件变化debounceTime

时间:2017-02-06 14:47:01

标签: angular rxjs

是否可以将debounceTime值设置为根据条件更改的内容?我有一个行为主题设置如此(并告​​诉我,如果我甚至做这部分错误):

this.searchSubject.asObservable().debounceTime(1000).subscribe(x => this.emitFilters())

我希望基于某些过滤条件的去抖时间不同,但是当我尝试在那里抛出一个函数时,VS Code会抱怨它无效。

我还看了一下debounce,它似乎采用了一种变量,但从文档中,我似乎无法弄清楚(我投入的函数根据VS Code返回了错误的类型,甚至虽然我从文档中删除了代码)。如果它有所作为,我正在Angular 2中做这一切。

1 个答案:

答案 0 :(得分:3)

你在哪里看到的文档表明.debounceTime会接受一个函数?它有详细记录here,具有以下签名:

public debounceTime(dueTime: number, scheduler: Scheduler): Observable

您正在寻找的方法是debounce,根据文档:

Emits a value from the source Observable only after a particular time span determined by another Observable has passed without another source emission.
It's like debounceTime, but the time span of emission silence is determined by a second Observable. 

这是签名:

public debounce(durationSelector: function(value: T): Observable | Promise): Observable

所以,你要做的就是设置另一个Observable,它将提供去抖动的间隔。

您可以使用另一个主题来执行此操作,您可以根据应用程序逻辑调用.next()以提供新的等待时间。

let debounceSubject = new Subject<number>();
let debounceObservable$ = debounceSubject.asObservable();

// Somewhere else in code you'll do debounceSubject.next(1000); for example

最后你会像这样设置新的辩护:

this.searchSubject.asObservable()
    .debounce(() => debounceObservable$).subscribe(x => this.emitFilters())

使用.debounce的更多示例可以找到here(学习rxjs的好网站),包括jsBin和jsFiddle的工作示例。