【发布时间】:2020-08-01 15:54:38
【问题描述】:
我正在尝试在 React 中实现一个使用 RxJs 的简单搜索框。设计很简单,向api发出请求的主要逻辑如下:
export class SeachService {
constructor() {
this.searchTerm = new Subject();
}
search(term) {
this.searchTerm.next(term.value);
}
doSearch(term) {
let promise = api.business.searchByCompany(term);
return Observable.fromPromise(promise);
}
getResults() {
return this.searchTerm
.debounceTime(300)
.distinctUntilChanged()
.switchMap((term) => (term ? this.doSearch(term) : Observable.of([])))
.map((response) => {
return {
details: response,
result_hash: Date.now(),
};
})
.distinctUntilChanged((a, b) => a.result_hash === b.result_hash)
.catch((error) => {
console.error(error);
return Observable.of([]);
});
}
}
我在 React 组件中使用它:
useLayoutEffect(() => {
const subscription = searchService
.getResults()
.subscribe((res) => setBusinessResults(res.details));
});
但是,这会导致对 API 进行多次 ajax 调用,就好像组件会重新渲染多次一样。当我使用简单的console.log(res.details) 时,我得到了预期的行为,即只进行一次调用并相应地进行限制。有没有办法解决这个问题?
【问题讨论】:
-
为什么要使用 Date.Now() 检查不同的调用?那将永远不同。你应该使用 term 而不是 no?