运行 如果在 Javascript 超时后没有新消息到达则触发

Run a trigger if no new message arrives after a timeout in Javascript

假设我有以下 Javascript 代码:

let lastTime = new Date().getTime();
for (let i = 0; i < 10; i++) {
    const differenceOfTime  = ((new Date()).getTime() - lastTime);
    lastTime = new Date().getTime();
    if ( differenceOfTime > 100 ){
        console.log('Hello')
    }
}

此代码测量当前循环与上一个循环之间的时间差,如果大于 100 毫秒,则打印 Hello。在这种情况下,它永远不会打印 Hello 因为这里的时间差永远不会超过 100 毫秒。

现在假设我有一个不同的 Javascript 代码如下:

async function executeAsync(){
    let lastTime = new Date().getTime();
    for (let i = 0; i < 10; i++) {
        await sleep(200)
        const differenceOfTime  = ((new Date()).getTime() - lastTime);
        lastTime = new Date().getTime();
        if ( differenceOfTime > 100 ){
            console.log('Hello')
        }
    }
}
executeAsync()

function sleep(time) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, time);
  });
}

在此代码段中,它将打印 Hello 10 次,因为在所有循环中,上一次循环与当前循环之间的时间差大于 100 毫秒。

问题是,如果 200 毫秒后没有任何反应,我会打印 Hello。我想要类似下面的伪代码:

let lastTime = new Date().getTime();
for (let i = 0; i < 10; i++) {
    const differenceOfTime  = ((new Date()).getTime() - lastTime);
    lastTime = new Date().getTime();
    if ( differenceOfTime > 100 ){
        setTimeoutThatExecutesOnlyIfNoNewMessageArrivedAfter(() => {
            console.log('Hello')
        }, 200)
        setTimeout()
    }
}

我想让这最后一个片段在最后一次循环迭代后仅打印一次 Hello。我知道我可以使用循环的最后一个索引来解决这个问题。但它们只是示例,在我的真实案例场景中,这些消息作为随机消息到达(它不在循环内),因此没有要使用的最后一个索引。我需要一种不同的方法,这就是为什么我考虑仅在没有新消息到达后才执行的超时。我可以使用 Javascript 函数来解决这个问题吗?如何在 200 毫秒后没有新的循环迭代后打印 Hello

setTimeout returns 可用于取消超时的 ID(使用 clearTimeout(ID))。如果及时收到消息,取消超时,re-start等待下一条消息。如果没有收到下一条消息,让超时 运行 并打印您的消息。

您可能需要这样的东西:

async function executeAsync(){
    let lastTime = new Date().getTime();
    let timeout = null;
    for (let i = 0; i < 10; i++) {
        console.log('Received Message');
        if (timeout) { clearTimeout(timeout); }
        timeout = setTimeout(() => console.log('Hello'), 200)
        await sleep(199)
    }
}
executeAsync()

function sleep(time) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, time);
  });
}