Javascript 捕获取消暂停的调用参数时取消暂停回调

Javascript 捕获取消暂停的调用参数时取消暂停回调,javascript,callback,Javascript,Callback,我正在收听一个事件发射器,需要处理传入的所有事件。但我的应用程序无法处理一个接一个的事件。我想取消对事件回调的影响,但我看到的所有取消影响实现都会删除取消影响调用的参数 如何才能取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取

我正在收听一个事件发射器,需要处理传入的所有事件。但我的应用程序无法处理一个接一个的事件。我想取消对事件回调的影响,但我看到的所有取消影响实现都会删除取消影响调用的参数


如何才能取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消取消 不过,您需要在商店之外定义此函数

您还需要想出一种将多个事件合并为一个事件的方法,例如。 通过合并对象,如以下示例所示:

//为wait ms解除给定函数的抖动
//(聚合参数,然后调用fn函数)
函数去BounceAgg(fn,等待=50){
让timeout=null;
让update={};
函数processUpdate(){
超时=空;
fn(更新);
更新={};
}
返回值=>{
update={…update,…value};
如果(超时==null)
timeout=setTimeout(processUpdate,wait);
};
}
函数存储fn(args){
log(“用:,args调用storeFn);
}
让去Bounced=去Bounceagg(storeFn);
//这些将分批进行
脱口而出({a:“童话故事”});
脱口而出({i:“爱饼干”});
脱口而出({a:“香蕉”});
取消公告({i:“取消公告”});
不发音({long:“string”});
//一段时间以后
设置超时(()=>{
脱口而出({另一个:“一个”})

}, 100);这应该在不删除的情况下维护所有更新,但在setInterval内循环以汇集调度的事件/值。显然,这需要根据具体的处理和时间进行调整。它还松散地模拟了可能出现大量事件并且需要批处理的情况

const updates=[];
函数分派器(值){
更新。推送(值);
}
const intervalId=setInterval(()=>{
const batch=updates.splice(0,20);
if(批次长度){
console.log('batch',batch);
/*
这里是你可以进行批处理的地方,
或者去商店检查反应性
*/
}
}, 1000);
//就像多个事件的演示一样
[…阵列(100)]
.map((_条目,索引)=>索引)

.forEach(entry=>dispatcher(entry))
我想这可以满足我的需要:

function myDebounce(fn, wait) {                                                                                                                                                                                                                                                                             
  let capturedArgs = [];
  let timeout = null;
  return arg => {
    capturedArgs.push(arg);
    if (timeout) clearTimeout(timeout);
    timeout = setTimeout(() => {
      timeout = null;
      fn(capturedArgs);
      capturedArgs = [];
    }, wait);
  };
}

更新是什么样子的,即需要批处理的参数是什么?@javan正常队列仍然会逐个调用处理,而不是批处理更新。@turtlefight这正是我要问的。@spiffytech您使用的是什么存储?vuex?redux?苗条店。但是,如果我在另一个项目上使用Vuex或Mobx,我仍然会遇到这个问题。尽管如此,即使不需要处理任何更新,也会有一个时间间隔。诚然,这里有一些猜测。我不熟悉Svelte store,但如果这是在vuex中,我会在一个动作中设置部分逻辑,并对
更新的更改做出反应,同时跟踪上次批处理的时间。基本上,如果它有一定数量的事件,或者从正在处理的最后一批经过了一段时间,则处理
更新
。使用vuex,您不需要手动批处理更新,它具有内置的变异合并。如果一次触发多个突变,vuex将仅在状态稳定后更新组件。(查看控制台,只有在所有100个突变都通过后,才会重新计算computed属性)