gpt4 book ai didi

angular - 无法使 debounceTime() 或 throttleTime() 处理 Angular http 请求

转载 作者:太空狗 更新时间:2023-10-29 17:33:00 26 4
gpt4 key购买 nike

对于我的生活,我无法完成这项工作。我搜索了又搜索,但找不到任何示例(所有示例都包含 .fromEvent()http.get 中没有)。

在我的模板中,我有这样的输入:

<input type="text" (input)="categoriesSearch($event)">

在我的组件中,我有以下内容:

categoriesSearch(event) {
this.categoriesSubscription = this.apiService
.getCategoriesList(this.uploadForm.get('categories').value)
.debounceTime(3000)
// .throttleTime(3000)
.subscribe(
(response) => {
this.categories = response.data;
}
);
}

这是我的 ApiService 中的方法:

getCategoriesList(keyword = null) {
const headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Bearer', this.authService.user.token);

const getParams: URLSearchParams = new URLSearchParams();
getParams.set('keyword', keyword);
return this.http.get(this.apiHost + '/categories', { headers: headers, search: getParams })
.map(response => response.json());
}

categoriesSearch() 方法中,我尝试了 debounceTime()throttleTime() (我也导入了它们,类(class) import 'rxjs/add/operator/debounceTime', import 'rxjs/add/operator/throttleTime').

但是 http.get 请求根本没有被反跳或限制!如果我在 3 秒内键入 10 个字符,它会发出 10 个 http 请求。

我到底要如何告诉 this.http.get 仅在自上次请求后至少 3 秒后或自“无请求”(意味着初始 3 秒延迟)后才发出请求)?好吧,也许在这里我应该说“自从我上次在我的输入中输入了一些东西”。

我也试过直接在服务中使用 debounceTime()/throttleTime(),在 .map() 运算符之前 - 但结果是一样的。

最佳答案

But the http.get request is not debounced or throttled at all! If I type 10 characters in 3 seconds, it makes 10 http requests.

您的实现方式有误。您需要先捕获输入,应用 denounce 并进行 HTTP 请求。

你可以通过多种方式实现

1) Observable.fromEvent

 <input type="text" #input>

组件

 @ViewChild('input') text: ElementRef;

ngAfterViewInit() {
let text$ = Observable.fromEvent(this.text.nativeElement, 'keyup')
.do(() => console.log("keyup"))
.debounceTime(3000)
.distinctUntilChanged()
.switchMap(() => getCategoriesList())
.subscribe(res => console.log(res));
}

2) 使用主题

<input type="text" (keyup)="search($event)">

组件

  searchTerms = new Subject<string>();

search(term: string): void {
this.searchTerms.next(term);
}

ngOnInit(): void {

this.searchTerms
.debounceTime(3000)
.distinctUntilChanged()
.switchMap(() => getCategoriesList())
.subscribe(term => {
console.log();
});

3)使用表单控件

 <input type="text" [formControl]="term">

组件

  term = new FormControl();

ngOnInit() {
this.items = this.term.valueChanges
.debounceTime(3000)
.distinctUntilChanged()
.switchMap(term => getCategoriesList(term))
.subscribe(res => console.log(res));
}

关于angular - 无法使 debounceTime() 或 throttleTime() 处理 Angular http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44183519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com