我正在创建一个与我的服务器方法接口的ajax实用程序.我想从jQuery.ajax()调用返回的对象中使用jQuery 1.5延迟方法.情况如下.
> serveride方法总是返回一个JSON对象:
{success:true | false,data:…}
>客户端实用程序启动这样的ajax调用
var jqxhr = $.ajax({…});
>问题区域:
jqxhr.success(function(data,textStatus,xhr) {
if(!data || !data.success) {
???? // abort processing,trigger error
}
});
return jqxhr; // return to caller so he can attach his own handlers
所以问题是如何取消所有调用者的附加成功回调一个触发器他的错误处理程序在提到与???? ?
文档说明了延迟函数调用列表是FIFO,所以我的成功处理程序绝对是第一个.
解决方法
(更新:
请注意,目前,jQuery Promises与 Promises/A+ specification不兼容 – this answer.更多信息)
请注意,目前,jQuery Promises与 Promises/A+ specification不兼容 – this answer.更多信息)
在您创建AJAX请求的函数中,您还可以创建一个延迟对象,并在将其解析和拒绝函数绑定到相应的$.ajax请求的回调之后,再通过一些自定义数据验证返回给调用者,如下所示:
function makerequest() {
var deferred = $.Deferred();
var promise = deferred.promise();
var jqxhr = $.ajax({
// ...
});
jqxhr.success(function(data,status,xhr) {
if (!data || !data.success) {
deferred.reject(jqxhr,'error');
} else {
deferred.resolve(data,xhr);
}
});
jqxhr.error(function(jqXHR,error) {
deferred.reject(jqXHR,error);
});
return promise;
}
现在任何人都可以使用它像任何这样的承诺你的功能:
var request = makerequest(); request.done(successCallback); request.fail(errorCallback);
甚至只是:
makerequest().then(successCallback,errorCallback);
如果你也添加这个:
promise.success = promise.done;
promise.error = promise.fail;
那么你的调用者将拥有(或许更熟悉).success()和.error()的接口,就像纯$.ajax()调用一样:
var request = makerequest(); request.success(successCallback); request.error(errorCallback);
(.complete()的实现作为读者的练习.)
看到这个演示:
> http://jsfiddle.net/_rsp/r2YnM/
> http://jsfiddle.net/_rsp/r2YnM/1/(更详细)
这是另一个直接从一个工作项目中拉出来的例子:
function ajax(url,data) {
var self = this;
var deferred = $.Deferred();
var promise = deferred.promise();
var jqxhr = $.ajax({
url: url,data: JSON.stringify(data),contentType: "application/json; charset=utf-8",dataType: 'json',type: 'POST'
}).done(function (msg,xhr) {
if (!msg || msg.Error) {
self.doError(msg.Error);
deferred.reject(jqxhr,'error');
} else {
deferred.resolve(msg,xhr);
}
});
return promise;
}