Estoy luchando con el siguiente código. He intentado muchas formas diferentes de hacerlo, pero termino con uno de los dos resultados incorrectos.Javascript - problema de cierre de setTimeout
for(i = 0; i < result.length; i++) {
var tmpBlockInfo = {
size: worldTest.data[0].size,
xStartPixel : result[i].x * worldTest.data[0].size,
yStartPixel : result[i].y * worldTest.data[0].size,
blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
}
var tmpFunc = function(){
worldTest.fillBlock(tmpBlockInfo, 157, 152, 124, 255)
};
var t = setTimeout(function(){
tmpFunc()
} , 500 * i);
}
El problema con el código anterior es tmpBlockInfo siempre recibe el último resultado [i] .x/resultado [i] .y. Así que estoy esperando cuando el tiempo de espera ejecuta la función es ver qué resultado [i] .x/result [i] .y se dejó después del bucle (en lugar de pasarlo como una "nueva" variable)
I Pensar en ponerlo en una función solucionaría el problema del cierre, pero no hay suerte.
También probamos:
for(i = 0; i < result.length; i++) {
var tmpBlockInfo = {
size: worldTest.data[0].size,
xStartPixel : result[i].x * worldTest.data[0].size,
yStartPixel : result[i].y * worldTest.data[0].size,
blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
}
var t = setTimeout(function(){
worldTest.fillBlock(tmpBlockInfo, 157, 152, 124, 255)
} , 10000 * i);
}
Con los mismos resultados que el primer código.
Si hago:
for(i=0; i < result.length; i++) {
var tmpBlockInfo = {
size: worldTest.data[0].size,
xStartPixel : result[i].x * worldTest.data[0].size,
yStartPixel : result[i].y * worldTest.data[0].size,
blockType : (Math.random() * 100 > 10) ? 'path' : 'wall'
}
setTimeout(function(passBlockInfo) {
worldTest.fillBlock(tmpBlockInfo, 157, 152, 124, 255)
} (tmpBlockInfo), 1000 * i);
}
lo hace procesar todas las funciones fillBlock correctamente. PERO los hace todos al mismo tiempo (por ejemplo, no los dispara uno a la vez. Simplemente los hace uno tras otro pero provoca el bloqueo (sin actualización de la pantalla) y sin demora entre cada uno.
Ayuda con esto sería genial!
Aunque esta es una pregunta común, +1 para mostrar varios buenos intentos de resolver el problema. –
...su último intento está muy cerca, pero necesita * devolver * una función que ejecute su código para que 'setTimeout' pueda ejecutarlo más tarde, y necesita usar el parámetro' passBlockInfo' en lugar del 'tmpBlockInfo' –