Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript通用异步/等待“;“去盎司”;_Javascript_Node.js_Async Await_Debounce - Fatal编程技术网

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,因为代码更具可读性和可管理性