javascript - 如何避免在 axios 中发送多个重复的 AJAX 请求
问题描述
是否可以使用 axios 自动限制所有发送到特定端点列表的请求?也许使用 axios 拦截器?
目前,我限制了发送 axios 请求的用户操作,但问题是我必须在任何有导致某些 AJAX 请求的用户操作的地方写这个。像这样
const throttledDismissNotification = throttle(dismissNotification, 1000)
const dismiss = (event: any) => {
throttledDismissNotification();
};
render() {
return (
<Button onClick={dismiss}>Dismiss Notification</Button>
)
}
这会导致很多混乱,我想知道这是否可以自动化。
就像是:
if(request.url in listOfEndpointsToThrottle && request.params in cacheOfPreviousRequestsToThisEndpoint) {
StopRequest();
}
显然这是伪代码,但你明白了。
解决方案
也许您可以尝试使用 axios 提供的取消功能。
有了它,您可以确保没有任何两个(或更多,取决于您的实现)处于待处理状态的类似请求。
下面,您将找到一个小型简化示例,说明如何确保仅处理最新请求。你可以稍微调整一下,让它像一个请求池一样工作
import axios, { CancelToken } from 'axios';
const pendingRequests = {};
const makeCancellable = (headers, requestId) => {
if (!requestId) {
return headers;
}
if (pendingRequests[requestId]) {
// cancel an existing request
pendingRequests[requestId].cancel();
}
const source = CancelToken.source();
const newHeaders = {
...headers,
cancelToken: source.token
};
pendingRequests[requestId] = source;
return newHeaders;
};
const request = ({
url,
method = 'GET',
headers,
id
}) => {
const requestConfig = {
url,
method,
headers: makeCancellable(headers || {}, id)
};
return axios.request(requestConfig)
.then((res) => {
delete pendingRequests[id];
return ({ data: res.data });
})
.catch((error) => {
delete pendingRequests[id];
if (axios.isCancel(error)) {
console.log(`A request to url ${url} was cancelled`); // cancelled
} else {
return handleReject(error);
}
});
};
export default request;
推荐阅读
- sql - 页面锁定已禁用
- javascript - 错误:找不到“<%=”的匹配结束标记
- javascript - 如何通过 Wordpress Customizer 动态添加和删除 CSS 文件
- c# - 如何在没有 linq 和其他类的情况下按字段对对象数组进行排序?(在 C# 中)
- python - 如何在 Tensorflow 中将 2 个图像发送到 1 个网络并计算对比损失?
- laravel - 在迁移时不让值可以为 ->default()
- asp.net - .Net - 在运行时将 ASP 按钮动态添加到 ASPX 中的表中
- mapbox-gl-js - 使用 mapbox 为动态图标/符号着色
- python-3.x - python如何获得多列下所有行对之间的差异
- wolfram-mathematica - Mathematica:使用指定精度的 E-notation 打印近似数