Javascript 为什么我的Ajax回调处理得太快?

Javascript 为什么我的Ajax回调处理得太快?,javascript,ajax,Javascript,Ajax,我有一个通用的ajax函数,我在代码中的许多地方调用它。它是相当标准的,除了我最近添加了一些额外的调试内容(试图解决这个问题),带有一个全局“ajaxworking”变量: rideData.myAjax = function (url, type, data, successfunc) { var dataJson = JSON.stringify(data), thisurl = quilkinUrlBase() + url; if (ajaxworking

我有一个通用的ajax函数,我在代码中的许多地方调用它。它是相当标准的,除了我最近添加了一些额外的调试内容(试图解决这个问题),带有一个全局“ajaxworking”变量:

rideData.myAjax = function (url, type, data, successfunc) {
    var dataJson = JSON.stringify(data),
        thisurl = quilkinUrlBase() + url;

    if (ajaxworking.length > 0) {
        console.log(thisurl + ": concurrent Ajax call with: " + ajaxworking);
    }
    ajaxworking = thisurl;
    $.ajax({
        type: type,
        data: dataJson,
        url: thisurl,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        success: function (response) {
            ajaxworking = '';
            successfunc(response);
        },
        error: webRequestFailed
    });
};
现在,我的代码中有一部分根据第一次调用的结果进行了第二次ajax调用:

    getWebRides = function (date) {
        var rideIDs = [];
        var intdays = bleTime.toIntDays(date);
        
        rideData.myAjax("GetRidesForDate", "POST", intdays, function (response) {
            rides = response;
            if (rides.length === 0) {
                $('#ridelist').empty();  // this will also remove any handlers
                qPopup.Alert("No rides found for " + bleTime.DateString(date));
                return null;
            }
            $.each(rides, function (index) {
                rideIDs.push(rides[index].rideID);
            });
            GetParticipants(rideIDs);
        });
    },
“GetParticipants”(也称为“myAjax”)在大多数情况下运行良好。但在我的代码的另一部分中,“GetWebRides”本身是在另一个ajax调用之后直接调用的,即有3个调用,每个调用取决于前一个调用。“顶级”电话如下所示:

rideData.myAjax("SaveRide", "POST", ride, function (response) {
        // if successful, response should be just a new ID
        if (response.length < 5) {
            // document re-arrangement code snipped here for brevity
            getWebRides(date);                      
        }
         else {
            qPopup.Alert(response);
        }
    });
rideData.myAjax(“SaveRide”、“POST”、ride、function(response){
//如果成功,响应应该只是一个新ID
如果(响应长度<5){
//为简洁起见,此处剪掉了文档重新排列代码
getWebRides(日期);
}
否则{
qPopup.警报(响应);
}
});
因此,只有当连续有三次这样的调用时,我才能在第三次调用中得到“并发”捕获:

GetParticipants:与GetRidesForDate的并发调用

并且(如果允许继续),这会导致服务器上出现严重问题,数据读取器已经打开。但为什么只有当GetParticipants被称为链中的第三个时才会发生这种情况

我明白了,经过一些研究。现在还有其他安排异步调用的方法,例如使用“承诺”,但我想了解这里发生了什么。

解决了这个问题。 我在这篇文章中注释掉的“文档重组代码”的一部分实际上是间接调用另一个Ajax调用(非常间接,因此需要很长时间才能找到)