1 回答
![?](http://img1.sycdn.imooc.com/54584cd10001404b02200220-100-100.jpg)
TA贡献1828条经验 获得超6个赞
有一个非常简单的解决方法可以解决您的问题,那就是使用let
而不是在您的语句中var
声明。i
for
for (let i = 0; i < allproducts.length; i++) { // ...}
问题在于,在对 的所有回调中fromURL
, 的值i
停留在 for 循环完成时的最后一个值。这是因为当您用 声明i
变量时var
,它的范围不仅在 for 循环内,而且在整个包含函数中。因此只有一个i
变量由所有回调共享,并且由于它们都在循环完成后运行,因此它们会获得最后一个值i
。如果您在回调中放置一个 console.log,您会发现情况确实如此。
let
另一方面,当您使用 时,i
会为 for 循环的每次迭代创建一个新变量。这是因为let
具有块作用域并且 for 循环是一个块。因此,每个回调都有自己唯一且正确的 值i
。
这是您的代码的工作版本:
const allproducts = [1, 2, 3, 4];
var canvas = new fabric.Canvas('foo');
for (let i = 0; i < allproducts.length; i++) {
// Product image
var articleNumber = allproducts[i];
const fullHeight = 1000;
const fullWidth = 500;
const imageUrl = 'https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRlkStdmho9qfM4ofmV4lSVRV_MPmrxPu1f1Q&usqp=CAU';
fabric.Image.fromURL(imageUrl, function(oImg) {
oImg.scaleToHeight(fullHeight / 10)
.set('originX', 'center')
.set('left', Math.floor(Math.random() * fullWidth))
.set('top', Math.floor(Math.random() * (fullHeight - 200)))
// Article Number
var text = new fabric.Text(' ' + allproducts[i] + ' ', {
left: oImg.left,
top: oImg.top + fullHeight / 10 + 2,
originX: 'center',
fontSize: 9,
fontFamily: 'Helvetica',
textAlign: 'center',
backgroundColor: 'white'
});
// Grouped Article number and Product Image
var product = new fabric.Group([oImg, text], {
hasControls: false,
});
// Add Product to Canvas
canvas.add(product);
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/4.1.0/fabric.min.js"></script>
<canvas id="foo" width="1200" height="1200"></canvas>
添加回答
举报