¿Por qué la función se ejecuta inmediatamente cuando uso setTimeout?

4 minutos de lectura

Avatar de usuario de Adler
Adler

Estoy tratando de escribir código simple con un setTimeoutpero el setTimeout simplemente no esperará el tiempo que se supone que debe hacerlo y el código se ejecuta de inmediato. ¿Qué estoy haciendo mal?

setTimeout(testfunction(), 2000);

  • () actúa aquí como un operador de invocación. Pero quieres pasar la función a setTimeoutno invocarlo.

    – Sime Vidas

    21 de agosto de 2011 a las 9:24

  • Dup de ¿Por qué mi llamada de función programada por setTimeout se ejecuta de inmediato?, Llamar a funciones con setTimeout(), Javascript setTimeout() ignora la duración del tiempo de espera

    – fuera

    9 de noviembre de 2011 a las 21:43

Avatar de usuario de Mat
Estera

Está llamando a la función de inmediato y programando su valor de retorno.

Usar:

setTimeout(testFunction, 2000);
                       ^

Aviso: sin padres.

  • ok, gracias… pero ¿hay alguna manera de enviar parámetros a la función como setTimeout(testFunction(obj),2000)??! por cierto, esto tampoco funcionará setTimeout(alert(“test”),2000)..

    – Adler

    21 de agosto de 2011 a las 9:24

  • @Adler: Sí: setTimeout(function() { alert("test"); }, 2000);

    –TJ Crowder

    21 de agosto de 2011 a las 9:25

  • @Adler: Es posible hacer setTimeout(alert, 2000, "test") pero no es compatible con IE.

    – pimvdb

    21 de agosto de 2011 a las 9:26

  • @Adler: Ver también: stackoverflow.com/questions/1190642/…

    – Estera

    21 de agosto de 2011 a las 9:27

Avatar de usuario de Jose Faeti
José Faeti

quitar el paréntesis

setTimeout(testfunction(), 2000);

Si desea enviar parámetros a la función, puede crear una función anónima que luego llamará a la función deseada.

setTimeout(function() {

    testfunction('hello');

}, 2000);

Editar

Alguien sugirió enviar una cadena como primer parámetro de setTimeout. Sugeriría no seguir esto y nunca enviar una cadena como primer parámetro setTimeout, porque se usará la función eval. Esta es una mala práctica y debe evitarse si es posible.

Avatar de usuario de Emil Vikström
Emil Vikström

Eliminar los paréntesis después de la testfunction nombre:

setTimeout(testfunction, 2000);

La razón es que el primer argumento para setTimeout debería ser una función referencia, no el valor de retorno de la función. En tu código, testfunction se llama inmediatamente y el valor devuelto se envía a setTimeout.

  • ok, gracias… pero ¿hay alguna manera de enviar parámetros a la función como setTimeout(testFunction(obj),2000)??! por cierto, esto tampoco funcionará setTimeout(alert(“test”),2000)…

    – Adler

    21 de agosto de 2011 a las 9:24


  • @Adler sí, puede pasar todos sus argumentos después del argumento de retraso, así: setTimeout(testFunction, 2000, obj)

    – Brandon McConnell

    29 mayo 2021 a las 19:31

Avatar de usuario de Shubham Arya
Shubham Arya

Veo muchas respuestas aquí, pero solo quiero tomarme un tiempo para explicar la causa raíz del problema.

En realidad, la función setTimeOut() es una función asíncrona y cuando pasa una función como uno de los parámetros a la función setTimeOut(), su secuencia de comandos en realidad no quiere perder el tiempo y quiere ejecutar la función pasada lo antes posible.

Entonces, hay algunas formas en que puede evitar esto. Puede usar devoluciones de llamada o promesas.

Consulte este enlace para obtener detalles rápidos: https://www.w3schools.com/js/js_promise.asp

Le mostraré cómo puede usar la devolución de llamada para lograr lo que desea lograr.

Haciendo –

setTimeOut(your_function_name_without_parentheses, <number of milliseconds>)

De hecho, puede decirle a su tiempo de espera que se ejecute primero y luego ejecute mi función de devolución de llamada pasada como el primer parámetro.

O si desea pasar un parámetro a la función de devolución de llamada, puede hacer algo como esto:

setTimeOut(() => {your_function_name_with_parentheses(argument_that_you_want_to_pass), <number of milliseconds>})

También hay otras formas que ya se respondieron anteriormente.

Además, soy un novato en JS, avíseme si hay lagunas en mi comprensión.

Avatar de usuario de Shraddha
Shraddha

Primero quita el paréntesis:

setTimeout(testfunction, 2000);

Y luego, si desea pasar parámetros en setTimeout función, se puede pasar de esta manera:

 setTimeout(testfunction, 2000, param1, param2);

Nota: Puede pasar varios parámetros según los requisitos de su función.

Avatar de usuario de shaILU
shailu

Bueno, es posible que haya obtenido la respuesta, pero estoy explicando la causa y la solución. Hay dos formas en las que puede llamar a una función después de la cantidad de tiempo requerida.

1. setTimeout(“FUNC_NAME ()’, TIME_IN_MS);
Aquí FUNC_NAME entre comillas dobles es la función original que desea llamar después de TIME_IN_MS milisegundos. Esto se debe a que si no pone las comillas, mientras se interpreta el script Java, la función se ejecutará inmediatamente y su propósito se verá frustrado. Para permitir que el intérprete omita la declaración, debemos poner comillas aquí.
2. setTimeout(función () {FUNC_NAME ()}, TIME_IN_MS);
Aquí se crea una función anónima que le dice al intérprete que ejecute si después de cierto tiempo en lugar de evaluar el tiempo.

gracias

Avatar de usuario de Jonathan Utsu Undelikwo
Jonathan Utsu Undelikwo

Elimine el paréntesis, actualmente está invocando la función de inmediato. Lo que se pasa actualmente a setTimeout es el valor devuelto por la llamada testfunction(), pero lo que debe pasar a setTimeout como primer argumento es una referencia de función

setTimeout(testfunction, 2000);

  • Gracias por la contribución, pero explique cómo esto agrega algo a las respuestas existentes que han existido durante una década.

    – ggorlen

    31 de julio de 2021 a las 18:33


¿Ha sido útil esta solución?