У меня есть программа, использующая методы ajax post и dataTables. После нескольких недель я решил, что просто не понимаю, как работает javascript. Вот мой JavaScript:Обеспечение выполнения javascript-функций в определенном порядке
$('#SaveTimeSheet').click(function() {
$("#TimeSheetLoader").removeClass("hidden");
GetSheetCount();
});
function GetSheetCount() {
$.ajax({
url: '@Url.Action("GetTimeSheetCount","TimeSheet",null)',
type: "POST",
data:{
OperatorId: $("#OperatorId option:selected").val()
},
success: function (Result) {
StartTimeSheet(Result.Result);
}
});
}
function StartTimeSheet(Result) {
$.ajax({
type: "POST",
url: '@Url.Action("Create", "TimeSheet", null)',
data: {
SpecificLocation: $("#SpecificLocation").val(),
DetailedPoint: $("#DetailedPoint").val(),
SheetStatus: $("#statusSlider").val(),
Description: $("#Description").val(),
OperatorHours: $("#OperatorHoursSlider").attr("data-value"),
OperatorMins: $("#OperatorMinsSlider").attr("data-value"),
AssistantHours: $("#AssistantHoursSlider").attr("data-value"),
AssistantMins: $("#AssistantMinsSlider").attr("data-value"),
OriginalQuote: $('input[name=OriginalQuote]:checked').val(),
QuoteNo: $("#QuoteNo").val(),
SINumber: $("#SINumber").val(),
OperatorId: $("#OperatorId option:selected").val(),
SiteName: $("#SiteId option:selected").text(),
Code: $("#SiteId option:selected").val() + "-" + $("#OperatorId option:selected").val() + "-" + (Result + 1) + "-" + today
},
success: function (Result) {
ProcessTable(Result.Result);
},
error: function (x, e) {
if (x.status == 0) {
alert('You are offline!!\n Please Check Your Network.');
} else if (x.status == 404) {
alert('Requested URL not found.');
} else if (x.status == 500) {
alert('Internel Server Error.');
} else if (e == 'parsererror') {
alert('Error.\nParsing JSON Request failed.');
} else if (e == 'timeout') {
alert('Request Time out.');
} else {
alert('Unknow Error.\n' + x.responseText);
}
}
});
}
function ProcessTable(Result) {
console.log("Start Table Process");
var datas = t.rows().data();
var total = $("#Table tr").length - 1;
var counter = 0;
for (var i = 0; i < total; i++) {
var value = datas[i];
AddItems(value, Result);
counter = counter + 1;
}
if (counter === total) {
SendPDF(Result);
}
}
function AddItems(value, Result) {
$.ajax({
type: "POST",
url: '@Url.Action("ProcessTable","TimeSheet",null)',
data: {
TimeSheetId:Result,
BOM_NO: value[0],
Stock_Code: value[1],
Stock_Description: value[2],
Quantity: value[3]
},
success: function (data) {
console.log(data.Result);
},
error: function() {
console.log("Error");
}
});
}
function SendPDF(Result) {
$.ajax({
type: "GET",
url: '/TimeSheet/SendTimeSheet?Id='+Result,
success: function (data) {
console.log(data.Result);
location.reload();
}
});
}
Проблемы я имею что программа выполняет функцию SendPDF в середине функции ProcessTable. Я попытался остановить это, используя оператор if, но он все еще выполняется.
Если вы знаете, как исправить мой код, отлично. Но если бы вы могли объяснить, как javascript выполняет функции и в каком порядке. И как контролировать этот порядок. Это было бы прекрасно.
Я не думаю, что это имеет какое-то отношение к JS, поскольку afaik выполняет функции JS как те же, что и на любом другом языке. Это больше похоже на недоразумение sync/async. – Carcigenicate
И я не понимаю, в чем проблема. «Проблема, с которой я столкнулась, заключается в том, что программа выполняет функцию« Отправить PDF »в середине функции ProcessTable.». Вы вызываете 'SendPDF' из' ProcessTable', хотя я бы ожидал, что он будет запущен. В чем проблема? – Carcigenicate
Ваша проблема заключается в вызове 'AddItems (value, Result);' в вашей 'ProcessTable' функции, где цикл будет выполнен до всех вызовов' AddItems'. – LGSon