在Vue.js组件中用Lodash编写异步函数遇问题,求解决方法
解决异步防抖函数的实现问题
嘿,我来帮你搞定这段代码里的坑!你的异步防抖函数没正确跑起来,主要是几个语法和逻辑问题,咱一个个说:
首先看你代码里的核心问题:
- 变量重复声明:函数参数已经有
vm了,你又在函数里写let vm = this,这会直接报错,而且完全没必要~ - 异步逻辑放错了位置:你把
await api.get()放在了_.debounce外面,但防抖的作用是延迟执行请求逻辑,得把异步代码放进防抖的回调函数里才行! - 语法错误:代码里的大括号没闭合,比如
_.debounce的箭头函数只开了头没结尾,这浏览器肯定认不出啊😅 - 防抖函数没调用:
_.debounce返回的是一个新的防抖函数,你得调用它才会生效!
修正后的基础版本代码
async search(loading, search, vm) { // 创建防抖函数,把回调改成async函数才能用await const debouncedSearch = _.debounce(async () => { const ApiURL = '/users/' try { // 这里的await终于能在防抖回调里生效了 const { res } = await api.get(ApiURL) vm.options = res.data } catch (error) { // 别忘了处理请求失败的情况,避免控制台飘红 console.error('搜索请求出错啦:', error) } }, 800) // 调用这个防抖后的函数 debouncedSearch() }
如果是Vue组件里用,还有个优化点!
要是这是Vue组件的方法,别每次调用search都重新创建防抖函数,不然防抖会失效(每次都是新的定时器)。最好把防抖函数提前缓存到组件实例上:
created() { // 在组件创建时就初始化防抖函数,复用同一个实例 this.debouncedSearch = _.debounce(async () => { const ApiURL = '/users/' try { const { res } = await api.get(ApiURL) // 直接用this访问组件实例的options,不用传vm参数啦 this.options = res.data } catch (error) { console.error('搜索请求失败:', error) } }, 800) }, methods: { search(loading, search) { // 直接调用预先创建好的防抖函数 this.debouncedSearch() } }
这样改完,你的异步防抖逻辑就能正常工作啦!
内容的提问来源于stack exchange,提问作者KitKit
相关产品推荐
相关产品推荐

