Estoy trabajando con el módulo gm npm que se ocupa de la manipulación de imágenes. y tengo este codigo
for(i=0;i < 4;i++){
gm("www/img/" + image[i]).crop(550, 406, 0, 0).write(function(err) {
console.log(this.outname + " created :: " + arguments[3]); //success
});
}
Este bucle está destinado a recorrer las imágenes.Arregla y recorta cada foto, pero solo recorta la última. Creo que es algo para hacer invocación de funciones y devoluciones de llamada, pero aún no avanzado para ese nivel.
Respuestas
4 para la respuesta № 1Cambia tu código a:
for (var i = 0; i < 4; i++) {
(function (i) {
gm("www/img/" + image[i]).crop(550, 406, 0, 0).write(function(err) {
console.log(this.outname + " created :: " + arguments[3]); //success
});
}).call(this, i);
}
de lo contrario el valor de i
será 3 cada vez que se invoque su devolución de llamada.
3 para la respuesta № 2
Necesitas crear un "cierre" sobre la variable
Js tiene un función alcance.
for (i = 0; i < 4; i++)
{
(function (a)
{
gm("www/img/" + image[a]).crop(550, 406, 0, 0).write(function (err)
{
console.log(this.outname + " created :: " + arguments[3]); //success
});
}).call(this,i)
}
o
that=this;
for (i = 0; i < 4; i++)
{
(function (a)
{
gm("www/img/" + image[a]).crop(550, 406, 0, 0).write(function (err)
{
console.log(that.outname + " created :: " + arguments[3]); //success
});
})(i)
}
editar:
También - lo haría también mantener una referencia a la arguments
Desde ahora, después de IIFE - los argumentos están cambiando.
puedes mantener tu arguments
a través de
var args= Array.prototype.slice.apply(arguments)
ejemplo:
function g()
{
for (i = 0; i < 4; i++)
{
(function (a)
{
console.log(arguments); //huh ? arguments are not a,b,c !!! anymore
})(i);
}
}
g("a","b","c") // 0,1,2,3
por lo tanto, es necesario mantener la referencia a los argumentos que se cambiaron después de IIFE.