Настройка
У меня есть форма, которая использует серию флажков для определения числа, выбранного на странице:
То, что он делает, выбрано, он вызывает контроллер, который сохранит выбор и вернет новую проверенную сумму на основе его текущих данных.
Код выглядит следующим образом
$('#myId').('click', '.selectorClass input', function() {
const inputCheckBox = this;
inputCheckBox.disabled = true;
$(inputCheckBox).addClass('disabled-checkbox')
$.ajax({
method: "POST",
url: "@(Url.Action<MyController>(c => c.MyEndPoint(Model.ItemId, null)))",
data: {
"boxWasChecked": inputCheckBox.checked
}
}).done(function (data) {
UpdateFields(inputCheckBox, data); //this would update the column footer and 'Total Quantity' field below
}).fail(function (data) {
// error check and handle here
}).always(function(data) {
inputCheckBox.disabled = false;
$(inputCheckBox).removeClass('disabled-checkbox')
});
});
Это прекрасно работает при выборе по одному и даже обычно работает при выборе нескольких.
Проблема
Проблема возникает, когда пользователь выбирает их очень быстро, а затем иногда последний запрос к fini sh не был последним, кто пришел / забрал данные из базы данных на стороне контроллера, и поэтому он возвращает неверную математику для всего.
См. Изображение ниже, где математика должна быть 11 (помните, что она добавляет значение каждого поля, а не количество отмеченных блоков), но сообщает 6.
Если бы я должен был выбрать последний флажок , он будет правильно сообщать 12, потому что он имеет все правильные данные для вызова.
Часть, где я застрял
Я думаю, что мне нужно каким-то образом составить список ajax вызовов, а затем отозвать запрос только в том случае, если есть запрос, добавленный после него, ИЛИ все остальные запросы перед ним были выполнены. Я не знаю, как это сделать с ajax вызовами.
Я играл с Promises / Fetch API и пытался заставить это работать, но мог получить обещание добавить к стек в Promise.all[myListOfAjaxCalls]
.
Сводка кода, над которым я работаю
var listOfPromiseCalls = []
$('#myId').('click', '.selectorClass input', function() {
// my checkbox is clicked
listOfPromiseCalls.push(myAjaxCall/myPromise)
// Psudeo code
// begin request if it is the only one in the list
// else
// kick off other requests that are in existing list infront of it
// if other requests finish before another input is clicked, begin this request
});