js防抖函数返回值问题解决方案

简介: 本文介绍了如何在JavaScript中创建一个带有返回值的防抖函数,通过结合Promise来实现。这种防抖函数可以在事件触发一定时间后再执行函数,并能处理异步操作的返回值。文章提供了防抖函数的实现代码和如何在实际项目中使用该防抖函数的示例。

需求:

当我们在使用防抖函数的时候会碰到需要使用传入函数的返回值的问题,所以我们配合promise来实现。

带有返回值的防抖函数:

/**
 * @param {函数} fn
 * @param {防抖时间间隔} wait
 */
//防抖函数
const debounce = () => {
   
    let timer = null;
    const newDebounce = function(fn, wait, ...args) {
   
        return new Promise((resolve, reject) => {
   
            if (timer !== null) {
   
                clearTimeout(timer);
            }
            timer = setTimeout(_ => {
   
                try {
   
                    resolve(fn(...args));
                } catch (e) {
   
                    reject(e);
                }
            }, wait);
        });
    };
    return newDebounce;
};

使用:
在 menuDrag.js中导出方法

//收集promose错误
const toAwait = (promise) => {
   
    return promise.then(data => [null, data]).catch(err => [err, undefined])
}

//移动菜单接口
export const moveBMenu = async (list = []) => {
   
    console.log("入参list", list);
    let data = await toAwait(secapi.secPost(process.env.VUE_APP_URL + 'bMenu/moveBMenu', {
    list }))
    if (data[1] !== undefined) {
   
        console.log("移动菜单接口", data[1])
        return data[1]
    } else {
   
        console.log("%c查询菜单接口", "color:red");
        return []
    }
}
//在页面引用js中的方法
import {
    moveBMenu } from './menuDrag.js';
 data() {
   
        return {
   
            newDebounce: debounce(),
            }
        },
methods: {
   
         //拖拽菜单请求接口
        async changeMoveBMenuList() {
   
        //this.queryList我接口需要的参数对象
            let result = await this.newDebounce(moveBMenu, 500, this.queryList);
            if (result.code === 1) {
   
                this.$message.success('移动菜单成功');
            } else {
   
                this.$message.error('移动菜单失败');
            }
        },

}
目录
相关文章
|
10月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
381 19
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
290 32
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
JavaScript
JS中防抖和节流的区别是什么
JS中防抖和节流的区别是什么
294 0
|
JavaScript 前端开发 UED
【面试题】面试官:说说你对js中的 防抖 和 节流 的理解
【面试题】面试官:说说你对js中的 防抖 和 节流 的理解
262 0
|
前端开发 JavaScript Java
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
424 3
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
686 154
|
JavaScript 前端开发 UED
JS 防抖与节流
防抖和节流是优化高频事件处理的技术。针对如`scroll`、`resize`等频繁触发的事件,它们能有效减少不必要的回调执行,节省资源。防抖确保在一段时间内仅执行最后一次操作,适用于输入框自动补全等场景;而节流则按固定间隔执行函数,适合拖拽、滚动事件。通过简单的JavaScript实现,可以显著提升应用性能和用户体验。
440 1
JS 防抖与节流

热门文章

最新文章

下一篇
开通oss服务