Почему мой обратный вызов Ajax обрабатывается слишком рано?

#javascript #ajax

#javascript #ajax

Вопрос:

У меня есть общая функция 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);
        }
    });
  

итак, только когда есть три последовательных вызова, подобных этому, я получаю «параллельный» улов в третьем:

Getучастники: одновременный вызов с GetRidesForDate

и (если разрешено продолжить) это вызывает неприятную проблему на сервере, когда datareaders уже открыты. Но почему это происходит только тогда, когда GetParticipants вызывается как третий в цепочке?

Я вижу, после некоторых исследований. что теперь есть другие способы организации асинхронных вызовов, например, с использованием ‘Promises’, но я хотел бы понять, что здесь происходит.

Ответ №1:

Решил это. Часть «кода реорганизации документа», которую я прокомментировал для этого поста, фактически вызывала другой вызов Ajax косвенно (очень косвенно, поэтому поиск занял много времени).