延迟jqueryajax包装器
我正在为jQueryAjax方法创建一个包装器,因为我的AJAX请求在实际进行之前依赖于异步工作 我目前正在做的是: 它有一个返回承诺的外部延迟。我启动doAsyncWork()并等待它完成,然后再实际执行AJAX请求。现在,虽然这样做有效,但问题是当其他脚本因为无法访问jQuery XHR对象的属性而使用包装器时延迟jqueryajax包装器,jquery,ajax,deferred,Jquery,Ajax,Deferred,我正在为jQueryAjax方法创建一个包装器,因为我的AJAX请求在实际进行之前依赖于异步工作 我目前正在做的是: 它有一个返回承诺的外部延迟。我启动doAsyncWork()并等待它完成,然后再实际执行AJAX请求。现在,虽然这样做有效,但问题是当其他脚本因为无法访问jQuery XHR对象的属性而使用包装器时 有没有办法优雅地解决这个问题呢?问题是:他们为什么要这样做?您是否尝试用包装器透明地替换$.ajax()?这将很快变得复杂,因为您将不得不考虑./P>的所有属性和方法。 从理论上讲,
有没有办法优雅地解决这个问题呢?问题是:他们为什么要这样做?您是否尝试用包装器透明地替换
$.ajax()
?这将很快变得复杂,因为您将不得不考虑./P>的所有属性和方法。
从理论上讲,这样做是可能的,但我不会称之为优雅,也不推荐它:
var ajax = function (options) {
var deferred = $.Deferred();
var promise = deferred.promise();
doAsyncWork()
.done(function (attributes) {
$.ajax(options)
.done(function () {
promise.readyState = 4
deferred.resolve.apply(this, arguments);
})
.fail(function () {
promise.readyState = 4
deferred.reject.apply(this, arguments);
});
})
.fail(function () {
deferred.reject();
});
promise.readyState = 0;
return promise;
};
其他readystate设置应该转到相应的回调(JQuery中没有onreadystatechange
)
那么,该怎么办呢?
如果其他脚本想要使用您的包装器,它们将不得不使用延迟API。如果出于某种原因,他们确实需要访问jqXHR
对象,您可以这样提供它:
var ajax = function (options, xhrReadyCallback) {
var deferred = $.Deferred();
doAsyncWork()
.done(function (attributes) {
var xhr = $.ajax(options)
.done(function () {
deferred.resolve.apply(this, arguments);
})
.fail(function () {
deferred.reject.apply(this, arguments);
});
xhrReadyCallback(xhr);
})
.fail(function () {
deferred.reject();
});
return deferred.promise();
};
用法:
ajax(options, function(xhr) {
// now available:
xhr.readyState;
});
无法直接传递jqXHR对象,因为它不是在函数返回时创建的
但是-不要忘记jqXHR在
done
和fail
回调中都可用,分别作为第三个和第一个参数。传递函数(){deferred.resolve.apply(this,arguments);}
与传递deferred.resolve本身是一样的,但是后者不需要额外的闭包。这是一个很好的解决方案!谢谢。
ajax(options, function(xhr) {
// now available:
xhr.readyState;
});