【发布时间】:2018-05-15 22:11:52
【问题描述】:
我有一个搜索输入,可以即时进行 API 调用。我想实现去抖动以减少服务器调用的数量。
_debouncedSearch() {
debounce(this.props.fetchRoutes(this.state.searchText), 1000);
}
_updateResults(searchText) {
this.setState({searchText});
this._debouncedSearch();
}
我期待debouncedSearch 每 1 秒。但它仍然是即时调用的。并抛出错误:
未捕获的类型错误:需要一个函数 去抖动时 (lodash.js?3387:10334)
未捕获的错误:引发了跨域错误。 React 无法访问开发中的实际错误对象。
我觉得这个问题必须经常被问到,但似乎没有一个解决方案对我有用。有人可以向我解释这里到底是什么问题吗?我认为去抖动只是一个 setTimeOut。
谢谢
【问题讨论】:
-
debounce 需要一个函数作为参数,你的
this.props.fetchRoutes(this.state.searchText)可能返回 void 或不是函数的东西,尝试反跳函数。使用() =>this.props.fetchRoutes(this.state.searchText)或function() { this.props.fetchRoutes(this.state.searchText) }: debounce 不仅仅是一个 setTimeout -
只是给其他人的说明,如果你在你的渲染方法中定义了一个去抖动函数,它会在每次渲染时重新创建,使去抖动无效。将其包装在 useMemo 中。 dmitripavlutin.com/react-throttle-debounce
标签: javascript reactjs lodash debounce