我正在使用一个函数 showVisible() 从 googlemap 收集所有标记 ID,将它们传递给一个数组,然后使用 AJAX 从服务器调用相应的对象数据。
只要有人点击 map 上的标记簇,就会触发此事件。如果有人在完成所有 ajax 调用之前单击标记,我需要停止循环遍历数组。
我曾尝试使用 if 语句,以便如果 breakAjax 为“true”,则循环应返回 false。尽管我可以在控制台上看到变量变为 true,但它并没有触发中断。
函数的完整代码如下:
function showVisible() {
visRunning = true
console.log('show visible')
$('#objects_list').empty()
function unique(list) {
var result = [];
$.each(list, function(i, e) {
if ($.inArray(e, result) == -1) result.push(e);
});
return result;
}
scoots = unique(locStr)
totalScoots = scoots.length
//console.log('total scoots ' + totalScoots);
var scootOutput = 0
for (var i = 0; i < scoots.length; i++) {
if (scootOutput === 0) {
$('#objects_list').empty()
}
console.log('breakAjax: ' + breakAjax)
countManager()
$.ajax({
url: 'https://scootapi.stuffstory.com/api/stuff/' + scoots[i],
dataType: 'json',
type: "get",
success: function(stuffData, textStatus, jqXHR) {
$('#objects_list').append('<a class="stuff_wrapper" target="_blank" onclick="ga("send", "event", "grid view scooter ' + stuffData.id + '", "click", "frontPage")" href="../scooter/?view=' + stuffData.id + '"><div class="stuff_holder" style="background-image:url(' + stuffData.image + '/convert?w=250&h=250);"><div class="scooter_title_sm"><div class="title_wrapper"><div class="scooter_title_1 cursive_sm">' + stuffData.make + '</div><div class="scooter_title_2 lato_sm">' + stuffData.model + '</div><div class="scooter_title_3 cursive_sm">' + stuffData.year + '</div></div></div></div></a>')
console.log('breakAjax: ' + breakAjax)
stuffSizer()
scootOutput++
if (scootOutput === totalScoots) {
visRunning = false
}
},
error: function(data, textStatus, jqXHR) {}
})
if (breakAjax === "true") {
return false;
}
};
}
最佳答案
breakAjax
的值在循环内不会改变。
JavaScript 是单线程的。
不在循环内的代码无法在循环运行时更改该变量的值(这实际上是瞬间发生的)。
你好像忘记了 Ajax 中的 A 代表异步。
您将遍历循环,发出 n 个 HTTP 请求并设置 n 个事件处理程序(成功函数),该处理程序将在 获得 HTTP 响应时运行 事件触发。
如果你想阻止 success 函数对数据做任何事情,那么你需要在 success 函数中测试 breakAjax
。
此时停止发送 HTTP 请求已经太晚了。如果这是目标,那么您将需要重构您的逻辑(可能使用递归函数),以便您的循环由 success
处理程序递增,而不是使用 for
。
关于javascript - 返回false,每次循环不取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337542/