假设我有一个$.Deferred
和一个jqXHR
对象。有没有办法将绑定到延迟的所有处理程序(然后,总是,完成,失败)转移到 XHR 对象(据我了解,它是延迟的扩展)?
这是我的想法:
$.ajaxOne = function(options) {
var xhr = null;
return function() {
if(xhr) xhr.abort();
xhr = $.ajax(options).always(function() {
xhr = null;
});
}
}
我想创建一个类似于 的函数,$.ajax
只是如果您快速连续多次调用它,它将中止最后一个请求,只完成最近的一个请求。这在您想要验证用户输入的许多场景中很有用。
例如,您可能想检查是否使用了用户名,但如果他们在您开始 ajax 调用后再次开始在用户名字段中输入,您不必关心最后的结果,只关心最近的结果。
另外,我认为请求不能保证以它们发出的相同顺序返回(我想取决于您的服务器设置),因此您也可能遇到同步问题。
无论如何,上面代码的问题是因为它返回一个函数,你可以随时执行你的ajax调用,但是你不能将你的完成处理程序绑定到它。所以我必须以某种方式混合延迟处理程序并将它们重新绑定到 XHR 对象。