2

Este bloque forma parte de la validación de un formulario. Esta parte es donde luego de validar el formulario sin errores muestra un mensaje y después de 5 segundos redirecciona a otra página usando setTimeout y window.location.href. Funciona correctamente, solo que no lo hace tomando en cuenta los segundos indicados.

¿Dónde está el error?

const esExito = true;

if(esExito) {
    const dire = "wishlist.html";
    $form.className = 'oculto';
    document.querySelector('#exito').className = '';
    setTimeout(redireccionar(dire), 5000);
} 

function redireccionar(dire) {
    window.location.href = dire ;
}
José Ignacio
  • 811
  • 1
  • 11
  • 16

4 Answers4

4

Te recomiendo dejarlo de la siguiente manera, dada la documentación de setTimeOut de developer.mozilla.org

const esExito = true;

if(esExito) {  
    setTimeout(function(){
         redireccionar();
         }, 5000);
} 

function redireccionar() {
    alert('redireccion');
}

Saludos y escribe cualquier duda.

harifo
  • 1,155
  • 5
  • 25
4

El problema es que estas llamando a la función con el método call (). Esto hace que la función sea llamada (se ejecute) en ese mismo instante. La solución es insertar la función dentro del setTimeout(una función anónima) o llamar a una referencia de esta función.

const esExito = true;

if(esExito) {
    const dire = "wishlist.html";
    setTimeout(function() {
        alert("Hola")
}, 3000);
} 
David_helo
  • 843
  • 8
  • 23
2

No toma en cuenta los segundos indicados porque estas ejecutando la funcion redireccionar(dire) el retorno es undefined cuando el timeout espera un tipo function colocare un ejemplo para que comprendas mas :

function tal(dir){
  //codigo a ejecutar
}
console.log(typeof(tal()))

lo ideal es que tu funcion espere por parametro y retorne una función esto se conoce como Clousure ó Clausuras mira el siguiente ejemplo:

console.log(typeof(redireccionar()))
setTimeout(redireccionar("av. siempre viva springfield"), 3000); 

function redireccionar(dire) {

    return () => console.log("direccion despues de los 3seg" ,dire) ;
}

Tu código quedaria de esta forma :

const esExito = true;

if(esExito) {
    const dire = "wishlist.html";
    $form.className = 'oculto';
    document.querySelector('#exito').className = '';
    setTimeout(redireccionar(dire), 5000);
} 

function redireccionar(dire) {
    return () => window.location.href = dire ;
}
JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
1

Estas agregando la funcion en tu mismo bloque de definicion de la primer funcion, aqui agrego una correccion y ya esta probada.

  function redireccionar(dire) {
       console.log('action');
        return () => window.location.href = dire ;
    }

    function verificaExito(){
    const esExito = true;

    if(esExito) {
        const dire = "wishlist.html";
       // $form.className = 'oculto';
       // document.querySelector('#exito').className = '';
        setTimeout(redireccionar(dire), 5000);
    } 
    }
    verificaExito();
Miguel Zarate
  • 2,334
  • 1
  • 8
  • 29