为什么我的程序会发出无休止的GET请求?

时间:2014-12-15 07:58:57

标签: javascript ajax soundcloud

该程序旨在按下更新按钮时在Google地图上发布最近的SoundCloud上传位置。每次"更新"时都会调用populate()按下按钮,将在地图上发布其中一个位置或调用重新填充数组的findLocations()。由于某种原因,findLocations()在populate()调用时会发出无限请求。这是我在JavaScript中的第一个程序,所以它可能是一个漂亮的noob错误,如果有人能够阐明它会很棒! GitHub链接也在这里。

编辑:当我设置断点并逐步执行程序时,findLocations()有效。我开始认为问题可能与GET请求是异步调用这一事实有关。这就是我的想法:

  1. "更新"按下按钮并调用locate()
  2. 地址显示为空,因此找到调用findLocations()
  3. findLocations()异步请求GET" / tracks"导致创建线程A和B.
  4. 线程A进入请求的回调函数并更新'地址'阵列。线程B离开findLocations()(不执行回调函数),返回locate()以递归调用自身。因为这种情况发生得更快,所以线程A能够更新地址'地址'仍然显示为空,因此再次调用findLocations,重复步骤3中的过程。
  5. 这个理论听起来是否合法?如果是这样,我将如何进行测试呢?

    https://github.com/blasian/soundcloud-map/tree/drunk

    var locations = [];
    var offset = 10;    
    
    // Create locations array
    function findLocations() {
        SC.get("/tracks", { limit: 10, offset: offset }, function(tracks){
            offset += 10;
            for (var i = 0; i < tracks.length; i++) {
                SC.get("/users/" + tracks[i].user_id, function(user){
                    if (user.country) { 
                        locations.push(user.country);
                        console.log(user.country);
                    }
                });
            }
        });
    }
    
    // Add next location to map
    function locate() {
        console.log(locations);
        if (locations.length > 0) {
            gcode(locations.pop());
        } else {
            findLocations();
            locate();
        }
    }
    

1 个答案:

答案 0 :(得分:3)

您正在使用递归函数:

function locate() {
    if (locations.length > 0) {
        // recursion stops here
    } else {
        // updateLocationsUsingAJAX()
        // recursion continues here
        locate();
    }
}

这不符合您的预期:

  1. 当AJAX请求更新locations变量时,JavaScript已经发出了数百个AJAX请求
  2. 事实上,AJAX回调不会被触发,因为JavaScript太忙于递归调用递归函数(更新变量排队等待JavaScript变为空闲的回调)
  3. 解决方案是重新安排代码,以便在AJAX回调函数中处理位置变量-OR- fire next AJAX request。