javascript - fabric.js - 如何将织物图像对象推送到数组中?

标签 javascript jquery html 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

最佳答案

您可能早就想通了 - 但以防其他人偶然发现:这里的问题是由于 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 循环变量 - 并且所以它保留了每次调用的值(value)。

关于javascript - fabric.js - 如何将织物图像对象推送到数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994540/

相关文章:

javascript - AngularJS 仅字符指令

javascript - 页面刷新后使用 cookie.js 保持 div 的切换状态

jquery.simplemodal > ie8 上的脚本错误

html - 网站出于某种原因允许水平滚动

javascript - 如何将策略绑定(bind)到 Sails.js 中的默认 REST 端点?

javascript - 如何使用 Angular2 初始化 Parse 并指向 serverURL

javascript - 如何使用 D3.js 在 HTML 元素中创建换行符

css - HTML 页面不会验证

javascript - 多个实例与具有动态内容的一个实例

jQuery 设置选定的文本