我的程序以非常奇怪的方式回应。当我单击按钮并调用selectService()
时它会正确处理,但最终的if / else语句表现得非常奇怪,因为它显示了if
和else
部分的消息。有时它会显示旧消息,然后显示新消息。
var i = 0;
function selectService() {
$("#tblServices tr").filter(':has(:checkbox:checked)').each(function() {
//i = 1; // to check if the looping has been done or not
//alert(i);
var url = '@Url.Action("CreateInvoice")';
var data = {
fk_BookingID: $("#Booking_ID").val(),
fk_ServiceID: $("td:eq(0)", this).text()
}
$.post(url, data, function(response) {
if (response.ReturnStatusJSON === true) {
alert(response.ReturnStatusJSON);
return true;
} else {
swal("Sorry !", response.ReturnMessageJSON, "error");
return false;
}
});
i = 1;
});
if (i === 0) {
swal("Sorry !", "You must select at least one service", "error");
return;
}
if (i > 0) {
var url2 = '@Url.Action("UpdateBookingInvoiceGeneration")';
var data2 = {
Booking_ID: $("#Booking_ID").val()
}
$.post(url2, data2, function(response) {
if (response.ReturnStatusJSON === true) {
swal("Done", response.ReturnMessageJSON, "success");
$('.selectColumn').prop("checked", false);
return;
} else {
swal("Sorry !", response.ReturnMessageJSON, "error");
}
});
}
}
发生了什么?为什么它会这样?我使用的是最新版本的Chrome。
更新
我在调试时看到了一个非常不同的问题。我在表格中选择了3个复选框,每个循环至少应该运行3次,但它首先运行2次并跳转到 if(i> 0),执行完全并再次跳转到选择服务功能并运行第3次检查,剩下的一次。
答案 0 :(得分:1)
我认为我理解你正在尝试做什么,并使用变量来检查.each
中的块是否已被执行是不好的做法。使用同步请求也是如此。
所以这是一个建议,希望有所帮助
function selectService() {
// First, manage the case where the user didn't select a service
if ($("#tblServices tr").filter(':has(:checkbox:checked)') === null) { // or check array length
swal("Sorry !", "You must select at least one service", "error");
return;
}
// Then, if he has
$("#tblServices tr").filter(':has(:checkbox:checked)').each(function() {
var url = '@Url.Action("CreateInvoice")';
var data = {
fk_BookingID: $("#Booking_ID").val(),
fk_ServiceID: $("td:eq(0)", this).text()
}
// Do your first request
$.post(url, data, function(response) {
if (response.ReturnStatusJSON === true) {
alert(response.ReturnStatusJSON);
var url2 = '@Url.Action("UpdateBookingInvoiceGeneration")';
var data2 = {
Booking_ID: $("#Booking_ID").val()
}
// Still in the callback, do the second one if you want it done AFTER
// getting the result for the first one
$.post(url2, data2, function(response) {
if (response.ReturnStatusJSON === true) {
swal("Done", response.ReturnMessageJSON, "success");
$('.selectColumn').prop("checked", false);
return;
} else {
swal("Sorry !", response.ReturnMessageJSON, "error");
}
});
return true;
} else {
swal("Sorry !", response.ReturnMessageJSON, "error");
return false;
}
});
});
}