我不确定我要提出的问题是否可能,或者是正确的做事方式,但是这里有。
我有一个网页,它使用AJAX从服务器加载一些数据并以可视方式显示。用户可以选择使用页面上的两个按钮之一来“滚动”按周过滤的数据。 这些按钮的代码类似于:
$("#leftButton").click(function () {
clearCurrentlyDisplayedData();
changeFilter(1); //Or -1, or whatever.
loadAndDisplayData();
}
在这个(简化)示例中,loadAndDisplayData()将使用AJAX调用来获取此数据,然后在请求完成时显示它,如:
$.get(
"web/service/address",
function (data, textStatus, jqXHR) {
//Display the data here
});
但是,当用户单击箭头以太快地滚动数据时会出现问题。如果快速连续点击两次按钮,则会显示两周的数据。
我不想要在收集数据之前禁用按钮 - 因为数据收集和显示确实需要一点时间,这会破坏用户导航的能力该网站很快就会变得很烦人。
当用户点击其中一个按钮以阻止加载两组数据时,是否可以终止当前正在执行的脚本或AJAX调用(或由此引起的函数)?还有其他方法可以解决这个问题吗?
答案 0 :(得分:3)
jqXHR
object has an abort()
method,您可以调用它来取消AJAX请求。
但是,这要求您保留对$.get()
返回的对象的引用。
更简单的方法是在发出请求时递增全局计数器,并在请求完成时递减它。在success
处理程序中,只显示计数器=== 0
的结果(例如,没有待处理的请求)。
答案 1 :(得分:1)
我还有其他方法可以解决这个问题吗?
不是中止请求,而是以清除数据和将新数据显示为单个操作的方式在$.get
内构建回调函数可能更好 - 即,在新数据准备好之前,不会清除数据。
Javascript一次只处理一个事件/线程,因此每个AJAX响应将在它们到达时以串行方式处理。