是否可以停止当前执行的Javascript代码?

时间:2012-07-09 13:56:39

标签: javascript jquery ajax

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

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

2 个答案:

答案 0 :(得分:3)

jqXHR object has an abort() method,您可以调用它来取消AJAX请求。

但是,这要求您保留对$.get()返回的对象的引用。

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

答案 1 :(得分:1)

我还有其他方法可以解决这个问题吗?

不是中止请求,而是以清除数据将新数据显示为单个操作的方式在$.get内构建回调函数可能更好 - 即,在新数据准备好之前,不会清除数据。

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