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

Why is my program making endless GET requests?

本文关键字:GET 请求 无休止 我的 程序 为什么      更新时间:2023-09-26

该程序旨在按下更新按钮时在Google地图上发布最近SoundCloud上传的位置。 每次按下"更新"按钮时都会调用 populate((,并且会在地图上发布其中一个位置或调用 findLocations(( 来重新填充数组。出于某种原因,findLocations(( 在由 populate(( 调用时发出无限的请求。这是我的第一个 JavaScript 程序,所以这可能是一个非常菜鸟的错误,如果有人能阐明这一点,那就太好了!GitHub链接也在这里。

编辑:findLocations(( 在我设置断点并逐步完成程序时起作用。我开始认为问题可能与GET请求是异步调用的事实有关。我认为这里正在发生的事情:

  1. 按下"更新"按钮并调用 locate((
  2. 地址显示为空,因此定位呼叫查找位置((
  3. findLocations(( 异步请求 GET "/tracks" 导致创建线程 A 和 B。
  4. 线程 A 进入请求的回调函数并更新"地址"数组。线程 B 离开 findLocations(((不执行回调函数(,返回 locate(( 以递归调用自身。由于这种情况发生得更快,因此线程 A 能够更新"地址","地址"仍然显示为空,因此再次调用 findLocations,重复步骤 3 中的过程。

这个理论听起来合法吗,如果是这样,我将如何去测试它?

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();
    }
}

您正在使用递归函数:

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

这不符合您的预期:

    当 AJAX 请求
  1. 更新 locations 变量时,JavaScript 已经触发了数百个 AJAX 请求
  2. 事实上,AJAX 回调不会被触发,因为 JavaScript 太忙于递归调用递归函数(更新变量的回调排队等待 JavaScript 空闲(

解决方案是重新排列代码,以便在 AJAX 回调函数中处理位置变量 -OR- 触发下一个 AJAX 请求。