【问题标题】:Delay calling a function by a few seconds?延迟调用函数几秒钟?
【发布时间】:2022-01-18 05:00:17
【问题描述】:

我对 setTimeout 和 setInterval 函数有疑问。 这是我的代码:

if (a == true)
{
  setTimeout(myFunction, 2000);
}

它确实将调用函数延迟了 2 秒,但是它会多次调用它,而我只想在满足条件并延迟 2 秒的情况下调用它一次 我使用过 setInterval,但我遇到了类似的问题

【问题讨论】:

  • 字母大小写很重要。请确保您使用setTimeout 而不是SetTimeout
  • 您不能使用function 作为变量名。这是一个保留关键字。
  • @connexo 它指的是函数
  • 如果您只想调用一次,那么setInterval 绝对是错误的选择。请包含更多相关代码,因为您发布的内容不会使该函数单独运行多次。
  • @ChrisG 我正在使用 p5js,这个函数在每帧连续执行的绘图函数中被调用,所以我猜它与此有关

标签: javascript settimeout


【解决方案1】:

听起来条件多次满足,您只希望条件的第一次true 评估触发延迟的函数调用。在这种情况下,您只需要跟踪它是否已经运行,然后将其更新为true

// In a shared scope so it can be modified inside the delayed function
var didRunWithDelay = false;

// Elsewhere
if (conditionWasMet && !didRunWithDelay) {
    didRunWithDelay = true;
    setTimeout(delayedFunction, 2000);
}

// Your function
function delayedFunction() {
    // Do stuff
}

如果你的条件可以多次true,那么每次都会调用延迟函数。因此,您可以在布尔值中跟踪该条件是否已经触发了setTimeout。如果没有,你调用它,否则跳过它。

【讨论】:

  • 这个方案基本没问题,但需要修复代码; a) didRunWithDelay = true; b) 需要在 // Elsewhere 部分设置
【解决方案2】:

函数setTimeout() 将一个函数作为参数,后跟一个数字,该数字对应于函数将执行的时间(以毫秒为单位)。

同样重要的是要记住setTimeout() 函数是异步执行的,即之后调用的函数将被直接调用,而不是在传入参数的时间过去之后。

setTimeout(() => {console.log("this is the first message")}, 5000);
setTimeout(() => {console.log("this is the second message")}, 3000);

在本例中,第二条消息将在第一条消息前 2 秒(2000 毫秒)显示!

可以通过函数名称和参数将引用作为参数传递,也可以通过编写() => { code here } 来使用匿名函数。

祝你有美好的一天!

【讨论】:

  • 对不起,但这并不能解决 OP 的问题。 setTimeout 调用在这里是偶然的,OP 的问题实际上是关于只调用一次函数,尽管包含调用的函数一次又一次地运行。
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2013-09-13
  • 2018-04-08
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多