2

我不确定我要问的是否可能或正确的做事方式,但这里有。

我有一个网页,它使用 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 调用(或由于这些调用而调用的函数)?有没有其他方法可以解决这个问题?

4

2 回答 2

3

jqXHR对象有一个abort()方法,您可以调用该方法来取消 AJAX 请求。

但是,这要求您保留对$.get().

一种可能更简单的方法是在发出请求时增加全局计数器,并在请求完成时减少它。在您的success处理程序中,仅在计数器显示结果=== 0(例如,没有待处理的请求)。

于 2012-07-09T13:58:59.193 回答
1

有没有其他方法可以解决这个问题?

与其中止请求,不如在内部构造回调函数$.get以清除数据并将新数据显示为单个操作 - 即,在新数据准备好之前不清除数据。

Javascript 一次只处理一个事件/线程,因此每个 AJAX 响应将在它们到达时被串行处理。

于 2012-07-09T14:03:02.077 回答