7

Se me ejecuta todo la vez después de un segundo en vez de ir de uno en uno, y querría saber como arreglarlo para que funciones correctamente

Código:

for (let i = 0; i < tierra.length; i++) {
    setTimeout(() => {
        gameScene.addChild(tierra[i]);
    }, 1000);
}
JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
Juankaxx
  • 75
  • 5

2 Answers2

7

Tu pregunta es mas de lógica, a como funciona, hay un truco para esto; y es sumarle los segundo que le corresponde esperar:

for (let i = 0; i < tierra.length; i++) {
    setTimeout(() => {
        gameScene.addChild(tierra[i]);
    }, 1000 + (1000 * i));
}

Te coloco el ejemplo para fines practicos:

for (let i = 0; i < 10; i++) {
        setTimeout(() => {
          let today = new Date();
            console.log(`mirenme soy i ${i} , segundo ${today.getSeconds()}` )
 
        }, 1000 + (i * 1000) );
  }

Lo que quieres hacer tambien se puede hacer por promesas pero dependera de la logica anterior; por lo pronto de esta forma es sencilla y practica


Con promesas quedaría mejor porque esperaria efectivamente 1 segundo despues de ejecutarse la primera instruccion (variacion de Francisco Romero)

function ejecutandoPromesas(longitud){
  if (longitud == 0){
    return 0
  }
  return new Promise(function (resolve , reject) {
    setTimeout(function(){
      console.log(longitud )
      resolve(ejecutandoPromesas(--longitud))
    },1000)
  })


}
console.log(ejecutandoPromesas(6))
JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
5

Si lo que quieres es que se ejecute cada iteración del bucle con un intervalo de tiempo de un segundo entre ejecución podrías crear una función que se fuera llamando a sí misma con un intervalo de 1 segundo mediante la función setTimeout.

Ejemplo:

function ejecutarCodigo(iteraciones){
  setTimeout(function(){
        console.log("Aqui tu código");
        
        if (--iteraciones) //Si es > 0, que siga llamando a la función
            ejecutarCodigo(iteraciones)
    }, 1000);
}

ejecutarCodigo(5);

donde 5 sería el número de iteraciones, tierra.length en tu caso.


En caso de que quisieras un bucle infinito que se repitiera cada segundo podrías utilizar la función setInterval.

Ejemplo:

setInterval(function() { 
      console.log("Aqui iría tu código"); 
}, 1000);
Francisco Romero
  • 16,194
  • 5
  • 30
  • 61