【发布时间】:2009-02-06 23:32:30
【问题描述】:
我正在使用 jQuery 进行一些 ajax 调用,想知道人们是如何处理这种情况的。
- 向服务器发出 ajax 请求以检索某些信息。
- 在请求返回之前发出另一个请求。第一个请求现在无效且已过期。
如何判断初始请求现在无效并且在返回时可以忽略。我只想显示第二个请求的结果并忽略(或取消)第一个。
【问题讨论】:
我正在使用 jQuery 进行一些 ajax 调用,想知道人们是如何处理这种情况的。
如何判断初始请求现在无效并且在返回时可以忽略。我只想显示第二个请求的结果并忽略(或取消)第一个。
【问题讨论】:
jQuery 从对ajax() 的调用中返回XmlHttpRequest 对象,我用它来实现您想要的,如下所示:
var lastRequest;
function getSomeData() {
if(lastRequest) {
lastRequest.abort();
lastRequest = null
}
lastRequest = $.ajax(...);
}
最终的结果是,如果发出后续请求,则早期请求的响应将被忽略。
【讨论】:
transport.abort();
记录一个标识请求的变量(例如:“request_id”)。在每次新请求时将变量加 1。仅当服务器返回的 request_id 等于您在客户端的变量时才处理请求。
【讨论】:
我以前从未遇到过这种情况,但是您可以发送一个在发出请求时递增的密钥,然后将密钥与响应一起发回。当响应到达时,您可以检查密钥是否符合您的预期。
var incrementor = 1;
var lastSent = 0;
jQuery(document).ready(function() {
jQuery('a.submitter').click(function(event) {
event.preventDefault();
lastSent = incrementor;
incrementor++;
jQuery.post(
'some-url.php',
{
'request-id': lastSent,
'other-data': 'some-data'
},
function( data, textStatus ) {
if( data.requestId == lastSent ) {
// Do stuff
}
},
'json'
);
});
});
【讨论】:
“如何判断初始请求现在无效”
你不要……! 您在客户端层排队 Ajax 请求,并且在之前的请求返回之前不要让它们触发并且完成它们对 DOM 的操作......
您可以在我关于“如何创建 Ajax 库”的博客中获得有关如何执行此操作的一些详细信息; http://ra-ajax.org/how-to-create-an-ajax-library-part-7-the-ra-ajax-class.blog
【讨论】:
我不希望涉及服务调用,您可能无法始终控制服务定义。我想看看这样的东西
$(function() {
$('.ajaxButton').click(function() {
$.currentCallId = (new Date()).getTime();
$.ajax({
type: "get",
url: 'http://www.google.com/',
beforeSend: function(xhr) {
this.callId = $.currentCallId;
},
success: function(data) {
if (this.callId === $.currentCallId) {
// process it
} else {
// throw it out
}
}
});
});
});
【讨论】: