//STARS
var stars_arr = new Array(6);
for(a=0;a<6;a++){
fabric.Image.fromURL(
'./img/util/star.png',
function(output){
canvas.add(output);
stars_arr[a] = output;
},
{
left:75+(a*29),
top:30,
width:23,
height:25,
selectable:false
}
);
}
console.log(stars_arr);
我想将每个星形图像对象推送到一个数组中,因为我会修改它们的一些繁荣。 但控制台告诉我 [未定义,未定义,未定义,未定义,未定义,未定义] 和stars_arr.length = 0
答案 0 :(得分:2)
你可能已经想到了这一点 - 但万一其他人偶然发现它:这里的问题是由于fabric.Image.fromURL是异步的。在执行任何回调函数之前,循环的所有迭代都会完成。因此,当它们最终被执行时,您的a
变量已经是6,并且在所有6次迭代中保持为6。
解决此问题的最简单方法是将调用封装在从循环调用的函数中。如:
//STARS
var stars_arr = new Array(6);
for (a = 0; a < 6; a++)
addStar(a);
function addStar(a) {
fabric.Image.fromURL(
'./img/util/star.png',
function(output) {
canvas.add(output);
stars_arr[a] = output;
}, {
left: 75 + (a * 29),
top: 30,
width: 23,
height: 25,
selectable: false
});
}
这样做,回调中对a
的引用是指传递给函数的a
,而不是a
循环变量 - 因此它会保留每次调用的值。