确保javascript函数按特定顺序执行
我有一个使用ajax post方法和数据表的程序。经过几周的磨蹭,我确定我根本不明白javascript是如何工作的。 以下是我的javascript:确保javascript函数按特定顺序执行,javascript,jquery,ajax,model-view-controller,datatables,Javascript,Jquery,Ajax,Model View Controller,Datatables,我有一个使用ajax post方法和数据表的程序。经过几周的磨蹭,我确定我根本不明白javascript是如何工作的。 以下是我的javascript: $('#SaveTimeSheet').click(function () { $("#TimeSheetLoader").removeClass("hidden"); GetSheetCount(); }); function GetSheetCount() {
$('#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();
}
});
}
$(“#保存时间表”)。单击(函数(){
$(“#TimeSheetLoader”).removeClass(“隐藏”);
GetSheetCount();
});
函数GetSheetCount(){
$.ajax({
url:'@url.Action(“GetTimeSheetCount”,“TimeSheet”,null)”,
类型:“POST”,
数据:{
运算符ID:$(“#运算符ID选项:选中”).val()
},
成功:功能(结果){
StartTimeSheet(Result.Result);
}
});
}
函数StartTimeSheet(结果){
$.ajax({
类型:“POST”,
url:'@url.Action(“创建”,“时间表”,空)”,
数据:{
SpecificLocation:$(“#SpecificLocation”).val(),
DetailedPoint:$(“#DetailedPoint”).val(),
SheetStatus:$(“#statusSlider”).val(),
说明:$(“#说明”).val(),
OperatorHours:$(“#OperatorHoursSlider”).attr(“数据值”),
运算符名:$(“#运算符名滑块”).attr(“数据值”),
辅助方法:$(“#辅助方法”).attr(“数据值”),
AssistantMins:$(“#assistantminslider”).attr(“数据值”),
OriginalQuote:$('input[name=OriginalQuote]:选中').val(),
QuoteNo:$(“#QuoteNo”).val(),
SINumber:$(“#SINumber”).val(),
运算符ID:$(“#运算符ID选项:选定”).val(),
SiteName:$(“#SiteId选项:选定”).text(),
代码:$(“#SiteId选项:选中”).val()+“-”+$(“#OperatorId选项:选中”).val()+“-”+(结果+1)+“-”+
},
成功:功能(结果){
ProcessTable(Result.Result);
},
错误:函数(x,e){
如果(x.status==0){
警报('您已脱机!!\n请检查您的网络');
}否则如果(x.status==404){
警报(“未找到请求的URL”);
}否则如果(x.status==500){
警报(“Internel服务器错误”);
}else if(e=='parserrror'){
警报('错误。\n传递JSON请求失败');
}else if(e=='timeout'){
警报(“请求超时”);
}否则{
警报('未知错误。\n'+x.responseText);
}
}
});
}
函数ProcessTable(结果){
log(“起始表进程”);
var data=t.rows().data();
var总计=$(“#表tr”)。长度-1;
var计数器=0;
对于(变量i=0;i
我一直遇到的问题是程序在处理稳定函数的中间执行SDEPDF函数。我试图通过使用if语句来阻止这种情况,但它仍然执行
如果你知道如何修复我的代码,太好了。但如果你能解释一下javascript是如何执行函数的,以及执行的顺序。以及如何控制这种秩序。那太好了
但如果你能解释一下javascript是如何执行函数的,以及执行的顺序。以及如何控制这种秩序。那太好了
JavaScript函数的工作原理与大多数其他语言中的函数类似:当您调用函数时,它运行到完成,然后控制返回到调用它的位置。(在大多数JavaScript环境中,您甚至不必担心多线程,因为虽然JavaScript不是单线程语言,但大多数使用它的环境中每个全局环境只使用一个线程,这使生活变得更加简单。)
代码中的问题是异步性。在您的代码中,<代码> sEdPDF < /C> >在<代码>过程结果> /COD>中间不被调用;在对AddItems
的所有调用完成并返回之后,将在接近结尾时调用它但是,当您调用AddItems
时,它所做的只是启动一个进程(一个ajax
请求),然后与运行JavaScript的线程分开异步继续。因此,在所有这些ajax调用之前,SendPDF
被称为
function AddItems(value, Result) {
// Return the Deferred that $.ajax gives us
return $.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);
}/*, - Probably don't want this, instead we'll handle
errors in the calling code
error: function() {
console.log("Error");
}*/
});
}
function ProcessTable(Result) {
console.log("Start Table Process");
var datas = t.rows().data();
var total = $("#Table tr").length - 1;
// Remember the promises from AddItems in an array
var promises = [];
for (var i = 0; i < total; i++) {
var value = datas[i];
promises.push(AddItems(value, Result));
}
// Wait until they're all resolved...
$.when.apply($, promises).then(
function() {
// ...and then call SendPDF
SendPDF(Result);
},
function() {
// At least one of the ajax calls failed, handle it
}
);
}