最后,我把数组的开始和完成请求添加到数组中(
ajaxCalls
和
doneAjaxCalls
像这样:
let ajaxCalls = [];
let doneAjaxCalls = [];
const fileInput = $('img#uploadedImg');
const fileExisted = fileInput.hasClass('imgExisted');
const fileWasRemoved = fileInput.hasClass('imgDeleted');
const fileWasUploaded = fileInput.hasClass('newImgUploaded');
const logo = fileInput.attr('src');
const needRemovePhoto = fileExisted && (fileWasRemoved || fileWasUploaded);
if (needRemovePhoto) {
const removePhoto = $.ajax({
type: submit.data('ajax-logo-delete-method').toUpperCase(),
url: submit.data('ajax-logo-delete-url'),
headers: headers,
data: {file: logo},
dataType: 'json',
error: function (response) {
doneAjaxCalls.push(response);
handleMultipleAjaxCalls(submit, ajaxCalls, doneAjaxCalls);
},
success: function (response) {
fileInput.removeClass('imgDeleted');
fileInput.removeClass('imgExisted');
if (fileWasUploaded) {
const sendPhoto = $.ajax({
type: submit.data('ajax-logo-create-method').toUpperCase(),
url: submit.data('ajax-logo-create-url'),
headers: headers,
data: {file: logo},
dataType: 'json',
success: function (response) {
fileInput.addClass('imgExisted');
},
complete: function (response) {
doneAjaxCalls.push(response);
handleMultipleAjaxCalls(submit, ajaxCalls, doneAjaxCalls);
}
});
}
else {
doneAjaxCalls.push(response);
handleMultipleAjaxCalls(submit, ajaxCalls, doneAjaxCalls);
}
}
});
ajaxCalls.push(removePhoto);
}
else if (fileWasUploaded) {
const sendPhoto = $.ajax({
type: submit.data('ajax-logo-create-method').toUpperCase(),
url: submit.data('ajax-logo-create-url'),
headers: headers,
data: {file: logo},
dataType: 'json',
success: function (response) {
fileInput.addClass('imgExisted');
},
complete: function (response) {
doneAjaxCalls.push(response);
handleMultipleAjaxCalls(submit, ajaxCalls, doneAjaxCalls);
}
});
ajaxCalls.push(sendPhoto);
}
const sendContactData = $.ajax({
type: submit.data('ajax-method').toUpperCase(),
url: submit.data('ajax-url'),
headers: headers,
data: data,
dataType: 'json',
complete: function (response) {
doneAjaxCalls.push(response);
handleMultipleAjaxCalls(submit, ajaxCalls, doneAjaxCalls);
}
});
ajaxCalls.push(sendContactData);
如你所见,在很多情况下,我会打电话给
handleMultipleAjaxCalls
函数,我这样定义这个函数:
window.handleMultipleAjaxCalls = function (submit, ajaxCalls, doneAjaxCalls) {
// if not all expected requests were done (success or failure), do nothing
if (doneAjaxCalls.length < ajaxCalls.length) {
return;
}
// here we know that all expected AJAX requests were completed (success or failure)
// here more logic after all requests are completed
});
因此,在我执行这个函数的情况下,它可能会发生,逻辑应该被启动,在这个函数中,我比较,如果所有的Ajax调用都真正完成了(仅仅是数组比较的简单长度)