我有一個數據集,其中包含一個HTML5畫布的圖層數組。我使用fabric.js來管理畫布的所有元素。應該按順序加載圖層,形成不同的場景。我通過forEach循環遍歷數據集。 (編輯 - 進一步研究後,我看到for和for循環都是同步的)。在JavaScript中,您可以強制循環在當前迭代完成之前不處理下一次迭代嗎?
問題是,一旦代碼到達加載圖像的位置,異步行爲就會啓動並且進程跳轉到下一個循環以開始處理下一個圖層。正如你可以想象的那樣,這會導致圖層在畫布上出現亂序並最終失真的場景。
我一直在研究這個問題,並研究了幾個星期,沒有多少運氣。
有什麼辦法可以防止forEach循環(或for循環)在當前結束之前不啓動下一次迭代?
這裏是我的foreach循環代碼:
$.ajax({
url: url,
method: "GET"
}).done(function (data) {
data.forEach(function (data) {
switch (data.layer_type) {
case "texture":
{
addTexture(data)
break;
}
case "color":
{
addColor(data)
break;
}
case "room":
{
addBaseImg(data);
break;
}
case "decor":
{
addBaseImg(data);
break;
}
case "floor":
{
addBaseImg(data);
break;
}
default:
{
addOtherObjects(data);
}
}
});
});
這裏是一個加載圖像的情況下的一個例子:
最初的函數觸發click事件:
function addTexture(data) {
$('img[data-obj-id="' + data.object_id + '"]').trigger("click");
}
導致此功能的
:
$(document).on("click", ".img-patt", function() {
var imgURL = $(this).data("src");
var _this = this;
//this is where the process skips to the next iteration, before the image is loaded and added to the canvas
fabric.Image.fromURL(imgURL, function (img) {
//some code to handle the pattern removed from here just to shorten up the snippet
var rect = new fabric.Rect({
name: "texture",
visible: true,
selectable: false,
data: {
type: $(_this).data("type"),
objid: $(_this).data("obj-id")
},
top: 0,
left: 0,
width: fabCanvas.width,
height: fabCanvas.height,
fill: pattern
});
fabCanvas.add(rect);
fabCanvas.renderAll();
});
});
你號無法進行循環等待。但你可以模仿一個循環延遲使用遞歸 – Rajesh
我最近[回答](https://stackoverflow.com/a/43535024/3783478)類似的[問題](https://stackoverflow.com/questions/43534797/keep -for - 環 - 從執行的功能於的JavaScript/43535024#43535024)。你可以嘗試嵌入它 – Rajesh
看看這個https://stackoverflow.com/questions/16149431/make-function-wait-until-element-exists請告訴它是否有幫助! 乾杯! –