运行 如果在 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);
});
}
假设我有以下 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);
});
}