const pendingRequests = new Set();
function requestWithDedup(key, apiCall) {
if (pendingRequests.has(key)) {
console.log('请求正在进行,忽略重复');
return Promise.reject('Duplicate request');
}
pendingRequests.add(key);
return apiCall().finally(() => {
pendingRequests.delete(key);
});
}
// 使用示例
document.getElementById('claim-btn').addEventListener('click', () => {
const userId = 'user_123';
requestWithDedup(`claim_${userId}`, () =>
fetch('/api/claim-coupon', { method: 'POST' })
);
});
// Axios 示例
let isSubmitting = false;
axios.interceptors.request.use(config => {
if (config.url === '/api/submit-order') {
if (isSubmitting) throw new Error('请勿重复提交');
isSubmitting = true;
}
return config;
});
axios.interceptors.response.use(
res => {
if (res.config.url === '/api/submit-order') isSubmitting = false;
return res;
},
err => {
if (err.config?.url === '/api/submit-order') isSubmitting = false;
return Promise.reject(err);
}
);