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接口防止重复请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解babel是如何将class语法糖转换为es5的语法

    详解babel是如何将class语法糖转换为es5的语法

    这篇文章主要详细介绍了babel是如何将class语法糖转换为es5的语法,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Javascript对象Clone实例分析

    Javascript对象Clone实例分析

    这篇文章主要介绍了Javascript对象Clone用法,实例分析了javascript对象克隆的相关技巧,需要的朋友可以参考下
    2015-06-06
  • TypeScript声明文件的语法与场景详解

    TypeScript声明文件的语法与场景详解

    使用ts进行开发的时候,不可避免的需要引用第三方的 JS 的库,但是默认情况下TS是不认识我们引入的这些JS库的,所以在使用这些JS库的时候,我们就要通过声明文件告诉TS它是什么,这篇文章主要给大家介绍了关于TypeScript声明文件的相关资料,需要的朋友可以参考下
    2022-05-05
  • js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口

    js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口

    去全角、半角空格 自动关闭当前窗口等实现函数。
    2009-04-04
  • JS是按值传递还是按引用传递

    JS是按值传递还是按引用传递

    在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference)。在计算机科学里,这个部分叫求值策略(Evaluation Strategy)。它决定变量之间、函数调用时实参和形参之间值是如何传递的。
    2015-01-01
  • 读Javascript高性能编程重点笔记

    读Javascript高性能编程重点笔记

    这篇文章主要介绍了读Javascript高性能编程重点笔记,需要的朋友可以参考下
    2016-12-12
  • 分享一道关于闭包、bind和this的面试题

    分享一道关于闭包、bind和this的面试题

    这篇文章主要给大家介绍了一道关于闭包bind、this的面试题,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • 将Sublime Text 3 添加到右键中的简单方法

    将Sublime Text 3 添加到右键中的简单方法

    下面小编就为大家分享一篇将Sublime Text 3 添加到右键中的简单方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • js定时器实例分享

    js定时器实例分享

    本篇文章主要介绍了js 定时器的语法、实例、与实现代码分析。具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • asp知识整理笔记3(问答模式)

    asp知识整理笔记3(问答模式)

    这是关于asp知识整理的第二份笔记,只有把最基础的问题搞清楚了,才能更好的学习ASP编程。
    2015-09-09

最新评论