像提交表单类似的数据的时候,连续点击两次会出现提交两次请求,前端有没有全局的js去控制这个?
debounce
和throttle
是目前用得最广泛的,具体可见楼上的一堆收藏;或者我也写了一个简易版的,用下面的函数包裹点击回调,如果前一次请求尚未结束,新请求会和旧请求一起返回。这样的话回调要返回Promise
const debounceAsync = originalFunction => {
let currentExcution = null;
const wrappedFunction = async function () {
// 1. locked => return lock
if (currentExcution) return currentExcution;
// 2. released => apply
currentExcution = originalFunction.apply(this, arguments);
try {
return await currentExcution;
}
finally {
currentExcution = null;
}
};
return wrappedFunction;
};
用法
const sleep = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms));
const debounceAsync_UNIT_TEST = async () => {
const goodnight = debounceAsync(sleep);
for (let i = 0; i < 8; i++) {
goodnight(5000).then(() => console.log(Date()));
await sleep(500);
}
console.warn('Expected output: 8 identical datetime');
};
其实所有的接口请求都有这个需求,因此可以对ajax封装一个代理层
代理层可以做两个事情
这样,不光是vue项目,也不光是post或者提交表单,所有的接口请求都具备了你需要的能力。
6 回答3.1k 阅读✓ 已解决
6 回答2.5k 阅读
5 回答6.5k 阅读✓ 已解决
2 回答2k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
2 回答1.8k 阅读✓ 已解决
方案一:申明一个变量,点击时置灰提交按钮。等接口调用结束放开按钮。
方案二:加防抖。放几个之前收藏的链接:
JavaScript 函数节流和函数去抖应用场景辨析
underscore 函数去抖的实现
underscore 函数节流的实现
JavaScript专题之跟着underscore学防抖
JavaScript专题之跟着 underscore 学节流