Javascript 调用Jquery Ajax成功方法太早?
我有一系列敲除组件,它们执行几个ajax调用返回服务器以获取数据。其中许多组件继承相同的javascript基类。在测试期间,我注意到这些ajax调用偶尔会捕获不正确的数据 我在浏览器控制台中的Javascript 调用Jquery Ajax成功方法太早?,javascript,jquery,ajax,knockout.js,Javascript,Jquery,Ajax,Knockout.js,我有一系列敲除组件,它们执行几个ajax调用返回服务器以获取数据。其中许多组件继承相同的javascript基类。在测试期间,我注意到这些ajax调用偶尔会捕获不正确的数据 我在浏览器控制台中的$.ajax成功方法中设置了一个断点,我注意到有时甚至在网络选项卡表示调用已完成返回数据之前,此成功方法就会触发。当我查看返回的数据时,它为我提供了当前页面的源,而不是查询的url。此页面一次执行40-50个ajax调用,但每个控件处理自己的加载 这似乎是完全随机发生的,如果我在页面上多次放置同一控件,通
$.ajax
成功方法中设置了一个断点,我注意到有时甚至在网络选项卡表示调用已完成返回数据之前,此成功方法就会触发。当我查看返回的数据时,它为我提供了当前页面的源,而不是查询的url。此页面一次执行40-50个ajax调用,但每个控件处理自己的加载
这似乎是完全随机发生的,如果我在页面上多次放置同一控件,通常会有几个控件成功加载,而其他控件则不会。以下是我所拥有的:
this.Update = function () {
this.updateParameters();
$.ajax({
type: "POST",
traditional: true,
url: this.ajax_location,
data: this.ajax_parameters,
success: function (data) {
this.seriesDataItems = new Array();
var that = this;
if (data.MonthlyTotals) {
data.MonthlyTotals.forEach(function (e, i, a) {
that.seriesDataItems.push([e.Item1, (+e.Item2.toFixed(2))]); // stupid Tuple serialization...
});
}
if (data.Total) this.visitCount(this.magicRegex(+data.Total.toFixed(2)));
this.posNeg(data.PercentYTD > 0 ? "fa fa-arrow-circle-down" : "fa fa-arrow-circle-up");
this.percentage(Math.round(Math.abs(data.PercentYTD * 100)) + "%");
this.seriesData(this.seriesDataItems);
}.bind(this),
error: function (returndata) {
alert("Error:\n" + returndata.responseText);
}
});
};
每页40-50个AJAX调用听起来太过分了。您确定您的服务器正在处理所有这些错误吗?您是否已禁用AJAX请求上的缓存?不幸的是,这是管理层希望使用的设计决策。该页面是一个包含大约30个小部件的仪表板。每个小部件可以包含几个较小的组件。他们希望每个小部件都是完全自包含和可重用的,这样它就可以进行自己的ajax调用。调用和查询之间的重叠非常小,因此更改设计范例仍然需要相当大的viewmodel。此外,我还没有禁用ajax调用上的缓存,但在每个页面加载上数据似乎都是准确的(当它实际上在调用成功处理程序之前等待请求完成时).我不确定,但可能有一个限制,限制了您可以同时执行的Ajax请求的数量。你可能想考虑排队Ajax请求。这是一个明显的问题,但是这种“腐败”是否发生在所有浏览器中,你测试过其他浏览器吗?每页40-50 Ajax调用听起来难以置信的过分。您确定您的服务器正在处理所有这些错误吗?您是否已禁用AJAX请求上的缓存?不幸的是,这是管理层希望使用的设计决策。该页面是一个包含大约30个小部件的仪表板。每个小部件可以包含几个较小的组件。他们希望每个小部件都是完全自包含和可重用的,这样它就可以进行自己的ajax调用。调用和查询之间的重叠非常小,因此更改设计范例仍然需要相当大的viewmodel。此外,我还没有禁用ajax调用上的缓存,但在每个页面加载上数据似乎都是准确的(当它实际上在调用成功处理程序之前等待请求完成时).我不确定,但可能有一个限制,限制了您可以同时执行的Ajax请求的数量。您可能需要考虑排队Ajax请求。这是一个明显的问题,但是这种“腐败”是否发生在所有浏览器中,您测试过其他浏览器吗?