这是在Internet Explorer 10上测试的,但是以类似于IE8的方式设置
我有两个ajax调用。第一个是异步的,第二个是同步的。在第一个中,我从一个月的日子里得到数据。 成功时,它会触发同步ajax调用以获得假期。
$(function () {
/*some code*/
Load();
}
function Load() {
/* Some irrelevant code */
var today = new Date();
var selectedDate = (today.getMonth() + 1) + "/" + today.getFullYear();
//PopUp that appears when the Ajax calls are made.
var $waitDialog = $('<div id="waitingPopUp"></div>'); //I shortened the content of this variable.
$waitDialog.dialog({
zIndex: 3000,
title: 'Processing...',
dialogClass: "no-close",
resizable: false,
draggable: false,
modal: true,
closeOnEscape: false
});
ajaxGetMonthRecord(selectedDate);
}
function ajaxGetMonthRecord(selectedDate) {
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: url + "/GetMonthData",
data: { 'monthRecord': selectedDate },
dataType: "json",
success: function (data) {
var holidays = ajaxGetHolidays(selectedDate);
createCalendar(data, selectedDate, holidays);
}
},
error: function (jqXhr, textStatus, errorThrown) {
alert("ERROR ON AJAX CALL N°1");
}
});
}
[后端功能] (这完美无缺):
[OperationContract, WebGet(ResponseFormat = WebMessageFormat.Json)]
public List<MonthData> GetMonthData(string monthRecord)
{
var date = monthRecord.Split('/');
var list = (new MonthData()).GetAll(Convert.ToInt32(date[0]), Convert.ToInt32(date[1])).ToList();
return list;
}
这是失败的时候:
function ajaxGetHolidays(selectedDate) {
var holidays;
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: url + "/GetHolidays",
data: { 'monthRecord': selectedDate },
dataType: "json",
async: false,
success: function (data) {
holidays = data;
},
error: function (jqXhr, textStatus, errorThrown) {
alert("ERROR ON AJAX CALL N°2");
}
});
return holidays;
}
[第二次AJAX通话的后端功能]:
[OperationContract, WebGet(ResponseFormat = WebMessageFormat.Json)]
//This function starts running in a loop and never returns the List to the Ajax Call N°2
public List<Holiday> GetHolidays(string monthRecord)
{
var date = monthRecord.Split('/');
var list = (new Holiday()).GetAll(Convert.ToInt32(date[0]), Convert.ToInt32(date[1])).ToList();
return list;
}
当第二个ajax调用设置为async: false
时,后端函数将触发并返回数据。但是当它到达后端函数的末尾时,它会再次触发,并再次在连续循环中触发,直到ajax调用抛出错误。
这是返回AJAX调用的错误信息。
readyState: 0
textStatus: "error"
errorThrown:
ABORT_ERR 20
code 19
DATA_CLONE_ERR 25
DOMSTRING_SIZE_ERR 2
HIERARCHY_REQUEST_ERR 3
INDEX_SIZE_ERR 1
INUSE_ATTRIBUTE_ERR 10
INVALID_ACCESS_ERR 15
INVALID_CHARACTER_ERR 5
INVALID_MODIFICATION_ERR 13
INVALID_NODE_TYPE_ERR 24
INVALID_STATE_ERR 11
message "NetworkError"
name "NetworkError"
NAMESPACE_ERR 14
NETWORK_ERR 19
NO_DATA_ALLOWED_ERR 6
NO_MODIFICATION_ALLOWED_ERR 7
NOT_FOUND_ERR 8
NOT_SUPPORTED_ERR 9
PARSE_ERR 81
QUOTA_EXCEEDED_ERR 22
SECURITY_ERR 18
SERIALIZE_ERR 82
SYNTAX_ERR 12
TIMEOUT_ERR 23
TYPE_MISMATCH_ERR 17
URL_MISMATCH_ERR 21
VALIDATION_ERR 16
WRONG_DOCUMENT_ERR 4
但是当我设置async: true,
时,它会执行后端函数循环并使用responseText:""
和errorThrown:""
引发错误,并且控制台会抛出以下内容:
XMLHttpRequest:网络错误0x2f78,由于错误00002f78无法完成操作。
或者后端函数永远不会被触发并且在成功时返回null(尽管这可能是因为异步调用尚未完成)并且控制台没有抓到任何有趣的东西。
我试图在有效的之前设置令人不安的ajax调用,但问题仍然存在。 我做错了什么,我该怎么做才能解决这个问题?
顺便说一句,我在google搜索中找到了this,说在IE中无法进行两次Ajax调用,因为一次中断了另一次(根据我的理解)。有谁知道这个问题?
提前致谢。
答案 0 :(得分:2)
尝试使用不同的方法,使用回调。 像这样的东西:
$(function () {
/*some code*/
Load();
});
function Load() {
var today = new Date();
var selectedDate = (today.getMonth() + 1) + "/" + today.getFullYear();
//PopUp that appears when the Ajax calls are made.
var $waitDialog = $('<div id="waitingPopUp"></div>'); //I shortened the
$waitDialog.dialog({
zIndex: 3000,
title: 'Processing...',
dialogClass: "no-close",
resizable: false,
draggable: false,
modal: true,
closeOnEscape: false
});
ajaxGetMonthRecord(selectedDate, function (result) {
var holidays = ajaxGetHolidays(selectedDate);
createCalendar(result, selectedDate, holidays);
});
}
function ajaxGetMonthRecord(selectedDate, callback) {
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: url + "/GetMonthData",
data: { 'monthRecord': selectedDate },
dataType: "json",
success: function (data) {
if ($.isFunction(callback)) {
callback(data);
}
}
, error: function (jqXhr, textStatus, errorThrown) {
alert("ERROR ON AJAX CALL N°1");
}
});
}
答案 1 :(得分:0)
尝试不同的方法后(谢谢@Sandcar),我决定以不同的方式攻击它;在第二个AJAX调用开始之前让第一个AJAX调用完成。这使得后端函数的行为符合预期(没有循环),但AJAX调用返回了一个错误(我在问题中发布了同一个错误)。
然后我发现它可能是Holiday类中的内容(之前我遇到过一个问题,我发现需要声明 setter,即使是空的,以便AJAX调用工作< / em>的)。
结果是Holiday类(我试图从中获取数据的那个)的属性是问题:
[DataMember]
public DateTime? Date
{
get
{
string date = string.Concat(this.Day, "/", this.Month, "/", this.Year);
return Convert.ToDateTime(date);
}
}
/*code for getters and setters for day, month, year and description about the holiday */
显然,AJAX并不喜欢DateTime?类型。这可以通过解析Date to a string来解决(如果有人认为这是解决此问题的正确方法,请随时回复并纠正我)。
我最终删除了[DataMember]
行,因为该属性对我来说是不必要的(添加setter并未解决问题,BTW)。