取消对jQuery AJAX延迟的“完成”监听器?

时间:2016-06-27 13:46:48

标签: ajax jquery-deferred

如果我有一个AJAX请求,我使用jQuery $.ajax()调用启动,并且当时附加了一个done()监听器,有没有办法取消监听?我有一个搜索类型字段的情况,如果一个请求发送到服务器,由于任何原因需要很长时间来响应,但在等待用户输入更多和第二个请求触发和快速返回,当第一个请求最终完成时,done()侦听器触发,用第一个请求的数据重写DOM,而不是第二个。

我尝试在第二次请求之前在AJAX上发出abort()调用,或在延迟权限上发出reject(),但是在第二次调用时显示第一次调用的错误状态在飞行中。

我尝试使用ID系统来排除哪个请求是“当前”请求,因此在done()侦听器中它首先检查“我还是最近的请求吗?”在更新DOM之前,但是应用程序需要为每个API端点创建ID / Hash方法似乎很笨拙?

1 个答案:

答案 0 :(得分:0)

在每个完成的回调中,您可以记录时间戳,并且仅当时间戳是最新的时间戳时才执行回调。所以:

var latest_ts = 0;
$.get('...').done(function() {
    var this_ts = (new Date).getTime();
    if (this_ts < latest_ts) return;
    latest_ts = this_ts;
    //callback code here...
});

因此,如果请求A被触发但是请求B在它之后被触发但是先返回,则时间戳被更新,并且将忽略A的回调,因为它的时间戳已过期。