防抖(debounce)处理时,如何传回不同参数?
我有一个接口,传入id,传出value;
由于多处需要使用到这个接口,我就想到可以把这些id拼接后,进行请求再进行分发;
const set = new Set();
let timer;
function collect(idList) {
return new Promise((resolve, reject) => {
idList.forEach((id) => {
set.add(id);
});
clearTimeout(timer);
timer = setTimeout(async () => {
const valueList = await getValue();
resolve(
valueList
.filter((item) => idList.includes(item.id))
.map((item) => item.value)
);
}, 300);
});
}
// 模拟请求
function getValue() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(Array.from(set).map((id) => ({ id, value: id + '' })));
}, 300);
});
}
collect([1, 2, 3, 4]).then((list) => {
console.log(list);
});
collect([1, 3, 5, 7]).then((list) => {
console.log(list);
});
collect([9, 8, 7, 6]).then((list) => {
console.log(list);
});
// 期望输出
// ['1', '2', '3', '4']
// ['1', '3', '5', '7']
// ['9', '8', '7', '6']
// 实际输出
// ['9', '8', '7', '6']
我是这么写的,但是这样的话 resolve
就被 clearTimeout
清除了。
这种情况下,应该怎么处理?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这里我们需要 Deferred 对象来处理,就会简单很多。
简单分析,我们需要两步,第一步压入待发送请求,第二步合并参数使用一个请求发送。你需要的 debounce 效果就是,每次做第一步动作的时候都起一个定时器去做第二步。
用
rxjs
: