fabric.js - 如何将Fabric图像对象推入数组?

时间:2014-04-10 17:06:30

标签: javascript jquery html5 html5-canvas fabricjs

    //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

1 个答案:

答案 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循环变量 - 因此它会保留每次调用的值。