JavaScript接口防止重复请求的方法总结

 更新时间:2024年12月25日 10:17:00   作者:我就不思  
在前端开发中,防止重复请求是一个常见的问题,重复请求不仅会增加服务器的负载,还可能导致数据不一致等问题,本文为大家整理了一些常用的解决方法,需要的可以参考下

摘要:

在前端开发中,防止重复请求是一个常见的问题。重复请求不仅会增加服务器的负载,还可能导致数据不一致等问题!

1、使用防抖(Debounce)或节流(Throttle)

防抖(Debounce):在用户停止触发某个事件一定时间后执行函数。例如,用户频繁点击按钮时,只有最后一次点击会触发请求。

function debounce(func, wait) {
    let timeout;
    return function() {
        const context = this;
        const args = arguments;
        clearTimeout(timeout);
        timeout = setTimeout(() => func.apply(context, args), wait);
    };
}

// 使用方法
const debouncedFetch = debounce((url) => fetch(url), 300);
debouncedFetch('https://api.example.com/data');

节流(Throttle):规定在一个单位时间内,只能触发一次函数执行。如果在同一个单位时间内多次触发函数,只有一次生效。

function throttle(func, limit) {
    let lastFunc;
    let lastRan;
    return function() {
        const context = this;
        const args = arguments;
        if (!lastRan) {
            func.apply(context, args);
            lastRan = Date.now();
        } else {
            clearTimeout(lastFunc);
            lastFunc = setTimeout(function() {
                if (Date.now() - lastRan >= limit) {
                    func.apply(context, args);
                    lastRan = Date.now();
                }
            }, limit - (Date.now() - lastRan));
        }
    };
}

​​​​​​​// 使用方法
const throttledFetch = throttle((url) => fetch(url), 2000);
throttledFetch('https://api.example.com/data');

2、使用标志位(Flag)来防止重复请求

通过设置一个标志位,在请求进行中时阻止后续请求。

let isFetching = false;

function fetchData(url) {
    if (isFetching) return;
    isFetching = true;

​​​​​​​    fetch(url)
        .then(response => response.json())
        .then(data => {
            // 处理返回的数据
        })
        .catch(error => {
            console.error('Error:', error);
        })
        .finally(() => {
            isFetching = false;
        });
}

3、使用 AbortController

AbortController 允许你在需要的时候中止请求。

const controller = new AbortController();
const signal = controller.signal;

function fetchData(url) {
    fetch(url, { signal })
        .then(response => response.json())
        .then(data => {
            // 处理返回的数据
        })
        .catch(error => {
            if (error.name === 'AbortError') {
                console.log('Fetch aborted');
            } else {
                console.error('Error:', error);
            }
        });
}

​​​​​​​// 在需要中止请求的地方调用 controller.abort()
controller.abort();

4、使用第三方库(如 Axios 和 Redux-Saga)

如果你在使用 Axios 或 Redux-Saga,可以利用这些库提供的中间件功能来实现防止重复请求。

Axios Cancel Token

Axios 支持取消请求的功能,可以通过 CancelToken 实现。

const axios = require('axios');
const CancelToken = axios.CancelToken;
let cancel;

​​​​​​​function fetchData(url) {
    if (cancel) {
        cancel('Operation canceled due to new request.');
    }
    cancel = null;
    const source = CancelToken.source();
    axios.get(url, { cancelToken: source.token })
        .then(response => {
            // 处理返回的数据
        })
        .catch(thrown => {
            if (axios.isCancel(thrown)) {
                console.log('Request canceled', thrown.message);
            } else {
                console.error('Error:', thrown);
            }
        });
}

总结

以上是几种常见的防止重复请求的方法,可以根据具体场景选择合适的方法。防抖和节流适用于频繁触发的事件,标志位和 AbortController 适用于需要手动控制请求的情况,而第三方库则提供了更强大的功能和灵活性。

到此这篇关于JavaScript接口防止重复请求的方法总结的文章就介绍到这了,更多相关JavaScript接口防止重复请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)

    Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)

    这篇文章主要为大家详细介绍了Bootstrap 最常用的JS插件,包括图片轮播carousel.js、标签切换tab.js、滚动监听scrollspy.js等,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • js 获取元素下面所有li的两种方法

    js 获取元素下面所有li的两种方法

    这篇文章主要介绍了js如何获取元素下面所有的li,有哪些方法,需要的朋友可以参考下
    2014-04-04
  • JS实现拖拽的方法分析

    JS实现拖拽的方法分析

    这篇文章主要介绍了JS实现拖拽的方法,结合实例形式分析了JS拖拽的实现原理、实现技巧与相关注意事项,需要的朋友可以参考下
    2016-12-12
  • JS实现简单拖拽效果

    JS实现简单拖拽效果

    这篇文章主要为大家详细介绍了JS实现拖拽效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • JavaScript之IE的fireEvent方法详细解析

    JavaScript之IE的fireEvent方法详细解析

    刚开始我以为是会跟平时使用onclick()一样,没想到最近在写javascript入门ppt的时候发现了,原来自己太自以为是了!看来还有很多javascript的细节没有掌握好啊
    2013-11-11
  • 浅析Js中的单引号与双引号问题

    浅析Js中的单引号与双引号问题

    本文是对Js中单引号与双引号的使用进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • 使用JavaScript实现简单图像放大镜效果

    使用JavaScript实现简单图像放大镜效果

    图像放大镜在很多网站中都扮演着重要的角色,大多数开发人员使用 jquery 来创建图像放大镜。在本教程中,我将向大家展示如何使用 HTML、CSS 和 JavaScript 制作一个简单的图像放大镜,需要的可以参考一下
    2022-08-08
  • Valerio 发布了 Mootools

    Valerio 发布了 Mootools

    Valerio 发布了 Mootools...
    2006-09-09
  • AutoJs实现刷宝短视频的思路详解

    AutoJs实现刷宝短视频的思路详解

    这篇文章主要介绍了AutoJs实现刷宝短视频的思路详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • js代码实现多人聊天室

    js代码实现多人聊天室

    这篇文章主要为大家详细介绍了js代码实现多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论