【发布时间】:2018-08-22 20:09:36
【问题描述】:
我有一个问题,即循环的索引顺序在回调中不断变化。请参阅下面的代码了解我尝试过的内容,我试图实现的目标是根据可用图层添加标记。但是,我遍历图层的顺序必须与添加标记的顺序相同。稍后,当我解决此问题时,目标是用户可以单击生成的标记,这将导致打开一个带有信息的图层。有谁知道解决方案是什么?我已经尝试过@patrickRoberts 和@stian 的cmets。
$(function(){
// I've tried the following:
// – async/await with promises
// – JavaScript Closures
// – Closures with IIFE (see example below)
'use strict';
//Cache DOM
let $win = $(window),
$doc = $(document),
$body = $('body'),
$layer = $('.layer'),
$drawingImage = $('.drawings__image'),
$markerContainer = $('.markers');
//Init
_addMarkers();
function _addMarkers(){
for(var i = 0; i < $layer.length; i++){
//Right order
console.log(i);
(function(i){
_calculateScaleFactor($drawingImage.eq(0), function(data){
//Wrong order
console.log(i);
});
})(i);
}
}
function _createMarker(x, y, ){
return $(`<span class="markers__single-marker" style="left:${x}px; top:${y}px;">${i}</span>`);
}
function _calculateScaleFactor(image, callback){
let newImage = new Image();
newImage.src = image.attr('src');
newImage.onload = function(){
let scaleFactor = newImage.width / image.width();
callback(scaleFactor);
}
}
})
【问题讨论】:
-
为什么顺序需要一样?您已经有了对索引的引用,因此使用它可能比依赖按顺序调用的回调更容易。
-
因为否则修正后的 layerData.x 和 layerData.y 不会保持它们的值。
-
啊,原因是因为你有一个需要正确执行顺序的
append()函数。不幸的是,$.each()没有尊重异步执行的选项,因此您需要放弃使用它来迭代您的元素,或者您应该在初始异步迭代之后使用它来迭代scaleFactors 的结果数组已完成。 -
哦,好吧,让我尝试将这两个功能分开。第一个用于为每个数据创建具有正确 layerData 的数组,第二个用于添加图层标记。如果这能解决我的问题,我会让你。提前致谢!另一方面,你是被雇用的吗?我目前的容量很低,正在寻找额外的双手。
-
我刚刚尝试将这两个函数分开,但这似乎并不能解决我的问题。我做了一个 for 循环来填充一个带有标记位置的数组,但是仍然由于加载,标记位置的存储顺序不断变化。 @PatrickRoberts 还有其他建议吗?
标签: javascript jquery loops callback closures