let timerObj = {};
const debounce = (timerObj, wait) => {
const newDebounce = function(fn, ...args) {
const promise = new Promise((resolve, reject) => {
if (!timerObj.debounce) {
timerObj.debounce = setTimeout(() => {
timerObj.debounce = null;
}, wait);
try {
resolve(fn(...args));
} catch (e) {
reject(e);
}
} else {
resolve(timerObj.res)
}
});
timerObj.res = promise
return promise
};
return newDebounce;
};
const test = async(val,val2 = '777')=>{
const result = debounce(timerObj,3000)(request,val,val2)
console.log(await result)
}
const request = (val,val2) => {
return new Promise((resolve)=>{
setTimeout(()=>{
console.log('request')
resolve(val+val2)
},3000)
})
}
test(111,'666')
test(222)
setTimeout(()=>{
test(333)
},2000)
setTimeout(()=>{
test(444)
},4000)
结果:可以看到在设置的三秒时间内的请求合并为了一个,并且返回为第一个
实际使用时可以以url和入参共同区分timerObj 或者使用闭包以适配不同url的请求