JavaScript通用异步/等待“;“去盎司”;
所以基本上我有一个异步事件回调,有时会很快触发。我想做的是立即执行一些方法,但在执行代码的最后一位之前,要等到最后一次偶数调用之后的一段时间 以下是一个例子:JavaScript通用异步/等待“;“去盎司”;,javascript,node.js,async-await,debounce,Javascript,Node.js,Async Await,Debounce,所以基本上我有一个异步事件回调,有时会很快触发。我想做的是立即执行一些方法,但在执行代码的最后一位之前,要等到最后一次偶数调用之后的一段时间 以下是一个例子: let debounceTimeout async function onEvent() { // do stuff here on every event const waitTime = 5000 await new Promise(resolve => { clearTimeout(d
let debounceTimeout
async function onEvent() {
// do stuff here on every event
const waitTime = 5000
await new Promise(resolve => {
clearTimeout(debounceTimeout)
debounceTimeout = setTimeout(resolve, waitTime)
})
// do stuff here only on the last event after waiting for "waitTime"
}
因此,上面的例子正是我想要的。然而,对于敏锐的人来说,你可能会意识到,在最终事件被无限期“等待”之前,一切都在进行中,这(我假设)是一个内存泄漏,因为它将不断创造出永远无法解决的新承诺
基本上,我想知道是否有任何通用的方法来进行谴责,这在功能上是相同的,但没有内存泄漏。如果可以以某种方式将其清理为一个简单的等待解除Bounce(timeInMS)
呼叫,则可获得额外积分
顺便说一句,我在想,也许是拒绝永远无法解决的暂停,但我不确定这是否是一个好办法
另外,我知道我的要求可以通过跟踪事件并在等待5秒钟后检查是否发生了新的事件来有效地实现,如果我需要这样做,就这样吧。也就是说,这将是我正在开发的应用程序中的一种常见模式,我想要更干净一点的东西,我希望这个想法不会太长。对于这个用例,承诺不是理想的机制:
setTimeout
本身似乎已经足够好地完成这项工作了const waitTime=700;
异步函数onEvent(){
//在这里做每一件事
log.textContent=“.”+log.textContent;
if(onEvent.resolve)onEvent.resolve(true);
如果(等待新的承诺)(解决=>{
onEvent.resolve=resolve;//获取一个句柄以优先解析此承诺
setTimeout(解析、等待时间);
}))return;//在超时发生之前已解析承诺
//仅在等待“等待时间”后的最后一次活动中在此处执行操作
log.textContent=“\n”+log.textContent.replace(/\n |$/,“已完成\n”);
}
//演示
setRandomInterval(一个事件,11000);
//用于不定期触发事件的实用功能
函数设置随机间隔(cb、最小值、最大值){
let timeout=setTimeout(()=>{
cb();
超时=设置随机间隔(cb、最小值、最大值);
},min+Math.random()*(max-min));
return()=>clearTimeout(超时);
}
对于这个用例,承诺不是理想的机制:
setTimeout
本身似乎已经足够好地完成这项工作了const waitTime=700;
异步函数onEvent(){
//在这里做每一件事
log.textContent=“.”+log.textContent;
if(onEvent.resolve)onEvent.resolve(true);
如果(等待新的承诺)(解决=>{
onEvent.resolve=resolve;//获取一个句柄以优先解析此承诺
setTimeout(解析、等待时间);
}))return;//在超时发生之前已解析承诺
//仅在等待“等待时间”后的最后一次活动中在此处执行操作
log.textContent=“\n”+log.textContent.replace(/\n |$/,“已完成\n”);
}
//演示
setRandomInterval(一个事件,11000);
//用于不定期触发事件的实用功能
函数设置随机间隔(cb、最小值、最大值){
let timeout=setTimeout(()=>{
cb();
超时=设置随机间隔(cb、最小值、最大值);
},min+Math.random()*(max-min));
return()=>clearTimeout(超时);
}
@CodyG。这个问题(和我遇到的所有问题一样)是,它需要回调作为执行的代码,我希望避免回调,转而使用async/await,因为代码可读性和可管理性更高。根据您执行类似操作的频率,学习rxjs可能是值得的?然后你可以订阅两次活动,一次是没有debounce的“每一个活动中的内容”,然后是debounce的“只等待一段时间”。例如:你为什么要使用承诺?onEvent
是否需要为代码的其余部分返回承诺?^此。通常情况下,事件侦听器没有理由返回承诺,因为事件发送者并不期望承诺。@CodyG。这个问题(和我遇到的所有问题一样)是,它需要回调作为执行的代码,我希望避免回调,并转到async/await,因为代码更具可读性和可管理性