2015-12-17 74 views
1

我使用函数showVisible()从googlemap收集所有标记ID,将它们传递给数组,然后使用AJAX从服务器调用相应的对象数据。返回false,不取消每个循环

只要有人在地图上点击标记集群,就会触发此操作。如果在所有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; 
    } 

    }; 
} 
+1

'breakAjax'是一个布尔值吗?如果是这样,if(breakAjax ===“true”)'if(breakAjax === true)'? – boombox

+0

糟糕。这是最初的,然后我在这里发布之前只是为了测试而改变它。我会改回来的,但似乎没有任何区别。 –

+1

我没有看到任何代码给breakAjax赋值,所以它怎么会是真的或“真”? – Quentin

回答

3

breakAjax的值不循环内改变。

JavaScript是单线程的。

不在循环内部的代码无法在循环运行时更改该变量的值(无论如何,这实际上几乎是瞬间发生的)。


您似乎忘记了Ajax中的A代表异步。

你去那边的循环,使得ñ HTTP请求和设立ň事件处理(成功函数)将运行时了HTTP响应事件触发。

如果你想停止成功功能,那么你需要在成功函数里面测试breakAjax

在那时停止HTTP请求被发送为时已晚。如果这是目标,那么您将需要重构您的逻辑(可能使用递归函数),以便您的循环通过success处理程序而不是使用for递增。

+0

很好解释,谢谢 –