我试图用setTimeout写简单的代码,但是setTimeout不能等待它应该等待的时间,代码立即执行。我做错了什么?
setTimeout
setTimeout(testfunction(), 2000);
wkftcu5l1#
您将立即调用该函数并调度其返回值。用途:
setTimeout(testFunction, 2000); ^
注意:没有括号。
cwxwcias2#
去掉括号
如果你想给函数发送参数,你可以创建一个匿名函数,然后调用你想要的函数。
setTimeout(function() { testfunction('hello'); }, 2000);
编辑
有人建议发送一个字符串作为setTimeout的第一个参数。我建议不要遵循这个,永远不要发送一个字符串作为setTimeout的第一个参数,因为eval函数将被使用。这是一个不好的做法,应该尽可能避免。
ukdjmx9f3#
删除testfunction名称后面的括号:
testfunction
setTimeout(testfunction, 2000);
原因是setTimeout的第一个参数应该是一个函数 reference,而不是函数的返回值。在您的代码中,testfunction被立即调用,返回值被发送到setTimeout。
pdtvr36n4#
我在这里看到了很多答案,但我只想花一些时间来解释问题的根本原因。实际上,setTimeOut()函数是一个异步函数,当你将一个函数作为参数之一传递给setTimeOut()函数时,你的脚本实际上不想浪费你的时间,并希望尽快执行你传递的函数。所以有几种方法可以绕过这个问题,你可以使用回调或promise。有关快速详细信息,请参阅此链接:https://www.w3schools.com/js/js_promise.asp我将向你展示如何使用回调来实现你想要实现的目标。借作出─
setTimeOut(your_function_name_without_parentheses, <number of milliseconds>)
实际上你可以告诉你的超时,请先执行你自己,然后再执行我作为第一个参数传递的回调函数。或者如果你想给回调函数传递一个参数,你可以这样做-
setTimeOut(() => {your_function_name_with_parentheses(argument_that_you_want_to_pass), <number of milliseconds>})
还有其他方法,上面已经回答过了。另外,我是一个新手JS,请让我知道,如果有任何差距,我的理解。
oo7oh9g95#
首先去掉括号:
然后,如果你想在setTimeout函数中传递参数,你可以这样传递:
setTimeout(testfunction, 2000, param1, param2);
**注意:**您可以根据自己的功能需求传递多个参数。
rta7y2nd6#
你可能已经得到了答案,但我解释的原因和解决方案。有两种方法可以在所需的时间后调用函数。
v7pvogib7#
去掉括号,当前你是立即调用函数,当前传递给setTimeout的是testfunction()调用的返回值,但是你应该作为第一个参数传递给setTimeout的是函数引用
20jt8wwn8#
任何遇到与立即调用函数和使用Node.js无关的问题的人,您的超时值可能太大,导致延迟默认为1。例如setTimeout(testFunction, 21474836471) == setTimeout(testFunction, 1)当延迟大于2147483647或小于1时,延迟将被设置为1。非整数延迟将被截断为整数。
setTimeout(testFunction, 21474836471) == setTimeout(testFunction, 1)
8条答案
按热度按时间wkftcu5l1#
您将立即调用该函数并调度其返回值。
用途:
注意:没有括号。
cwxwcias2#
去掉括号
如果你想给函数发送参数,你可以创建一个匿名函数,然后调用你想要的函数。
编辑
有人建议发送一个字符串作为setTimeout的第一个参数。我建议不要遵循这个,永远不要发送一个字符串作为setTimeout的第一个参数,因为eval函数将被使用。这是一个不好的做法,应该尽可能避免。
ukdjmx9f3#
删除
testfunction
名称后面的括号:原因是
setTimeout
的第一个参数应该是一个函数 reference,而不是函数的返回值。在您的代码中,testfunction
被立即调用,返回值被发送到setTimeout
。pdtvr36n4#
我在这里看到了很多答案,但我只想花一些时间来解释问题的根本原因。
实际上,setTimeOut()函数是一个异步函数,当你将一个函数作为参数之一传递给setTimeOut()函数时,你的脚本实际上不想浪费你的时间,并希望尽快执行你传递的函数。
所以有几种方法可以绕过这个问题,你可以使用回调或promise。
有关快速详细信息,请参阅此链接:https://www.w3schools.com/js/js_promise.asp
我将向你展示如何使用回调来实现你想要实现的目标。
借作出─
实际上你可以告诉你的超时,请先执行你自己,然后再执行我作为第一个参数传递的回调函数。
或者如果你想给回调函数传递一个参数,你可以这样做-
还有其他方法,上面已经回答过了。
另外,我是一个新手JS,请让我知道,如果有任何差距,我的理解。
oo7oh9g95#
首先去掉括号:
然后,如果你想在
setTimeout
函数中传递参数,你可以这样传递:**注意:**您可以根据自己的功能需求传递多个参数。
rta7y2nd6#
你可能已经得到了答案,但我解释的原因和解决方案。有两种方法可以在所需的时间后调用函数。
这里,双引号内的FUNC_NAME是您要在TIME_IN_MS毫秒后调用的原始函数。这是因为如果您不加引号,那么在解释java脚本时,该函数将立即执行,您的目的将落空。为了让解释器跳过语句,我们需要在此处加引号。
这里创建了一个匿名函数,告诉解释器在一定时间后执行if,而不是计算时间。
谢谢shaILU
v7pvogib7#
去掉括号,当前你是立即调用函数,当前传递给setTimeout的是testfunction()调用的返回值,但是你应该作为第一个参数传递给setTimeout的是函数引用
20jt8wwn8#
任何遇到与立即调用函数和使用Node.js无关的问题的人,您的超时值可能太大,导致延迟默认为1。
例如
setTimeout(testFunction, 21474836471) == setTimeout(testFunction, 1)
当延迟大于2147483647或小于1时,延迟将被设置为1。非整数延迟将被截断为整数。