我了解Observable.debounce()
可用于处理 快速火 表单输入。由于Http GET也返回一个Observable,我想它有可能去掉快速的http请求吗?我尝试了 debounceTime()
,但它似乎没有做任何事情。
public getStuff(p1, area:string, p2:string): Observable<number> {
return this.http.get(some_url)
.map(r => r.json())
.debounceTime(10000)
.catch(this.handleError);
};
答案 0 :(得分:8)
debounceTime
允许缓冲事件,并且只在一段时间后处理最后一个事件。
它在输入的上下文中很有用,但它应该在observable上定义,触发事件而不是为HTTP请求创建的事件。
以下是与利用debounceTime
运算符的输入关联的控件的示例:
@Component({
(...)
template: `
<input [ngFormControl]="ctrl"/>
`
})
export class MyComponent {
constructor() {
this.ctrl = new Control();
this.ctrl.valueChanges
.debounceTime(500)
.distinctUntilChanged()
.switchMap((value: string) => {
// Get data according to the filled value
return this.service.getData(entry);
})
.subscribe(data => {
// Update the linked list
this.list = data;
});
}
}
本文也可能对您感兴趣:
根据micryks的评论,这是一个额外的链接:
答案 1 :(得分:1)
在Angular7中:
import { Observable, of, timer } from 'rxjs';
import { catchError, retry, map, debounce } from 'rxjs/operators';
public getStuff(p1, area:string, p2:string): Observable<number> {
return this.http.get(some_url)
.pipe(
debounce(() => timer(10000)),
catchError(this.handleError)
);
};
答案 2 :(得分:0)
您必须使用switchMap将subject observable转换为http observable,如下所示:
observableObj$: Observable<any>;
subjectObj = new Subject();
ngOnInit() {
this.observableObj$ = this.subjectObj.pipe(
debounceTime(1000),
switchMap(() => {
...
return this.http.get(some_url).map(r => r.json());
}),
);
this.observableObj$.subscribe((data) => {
// result of http get...
...
});
}
getStuff() {
this.subjectObj.next();
}