1 回答

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>
添加回答
舉報