#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 косвенно (очень косвенно, поэтому поиск занял много времени).