Javascript 提供默认值';失败';jQuery延迟对象的方法
我正在使用jQuery编写一个Javascript API客户端。我的顶级请求方法如下所示:Javascript 提供默认值';失败';jQuery延迟对象的方法,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,我正在使用jQuery编写一个Javascript API客户端。我的顶级请求方法如下所示: function request(method, uri, params, proxies) { var deferred = $.Deferred(); $.ajax({ data: method == 'GET' ? params : JSON.stringify(params), contentType: 'application/json', dataType:
function request(method, uri, params, proxies) {
var deferred = $.Deferred();
$.ajax({
data: method == 'GET' ? params : JSON.stringify(params),
contentType: 'application/json',
dataType: 'json',
url: api.root + uri,
type: method,
xhrFields: {
withCredentials: true
}
}).done(function(body) {
deferred.resolveWith(this, [body.data]);
}).fail(function(xhr) {
deferred.rejectWith(this, [xhr]);
});
return deferred.promise();
},
如何为返回的延迟处理程序设置默认的fail
处理程序?也就是说,如果延迟处理程序没有附加到其fail
条件的其他处理程序,则调用默认处理程序
我想这样做是为了在我的应用程序中有全局异常处理,除了具有特定处理的部分(并且将在延迟的应用程序上定义自己的
fail
处理程序)。因此,从2016年起,在API中使用jQuery ajax的最干净的方法是返回一个承诺。但是,您无法确定调用方是否已将错误处理程序附加到承诺
因此,我建议您只需在函数中添加一个新参数,告诉函数不要应用默认的错误处理,因为调用方将负责错误处理。而且,我建议您避免promise反模式,只使用现有的promise$。ajax()
已经返回,而不是创建自己的延迟:
function request(method, uri, params, proxies, skipDefaultErrorHandling){
// default error handling will be used if nothing is passed
// for skipDefaultErrorHandling
var p = $.ajax({
data: method=='GET'?params:JSON.stringify(params),
contentType: 'application/json',
dataType: 'json',
url: api.root + uri,
type: method,
xhrFields: {
withCredentials: true
}
});
if (!skipDefaultErrorHandling) {
// apply default error handling
p = p.then(null, function(jqXHR, textStatus, errorThrown) {
// put here whatever you want the default error handling to be
// then return the rejection with the various error parameters available
return $.Deferred().reject([jqXHR, textStatus, errorThrown]);
});
}
return p;
};
然后,调用方决定是否应用自己的错误处理:
request(...).then(function(data) {
// success code here
});
或者,您可以使用传入的非承诺
failHandler
回调,默认错误处理将查看该failHandler
是否传入。这是承诺和回调的混合体,我通常不会选择构建它,但由于您的问题要求承诺不支持的东西,这是实现以下目标之一:
function request(method, uri, params, proxies, failHandler){
// default error handling will be used if nothing is passed
// for skipDefaultErrorHandling
var p = $.ajax({
data: method=='GET'?params:JSON.stringify(params),
contentType: 'application/json',
dataType: 'json',
url: api.root + uri,
type: method,
xhrFields: {
withCredentials: true
}
});
// apply default error handling
p = p.then(null, function(jqXHR, textStatus, errorThrown) {
if (failHandler) {
// call passed in error handling
failHandler.apply(this, arguments);
} else {
// do your default error handling here
}
// then keep the promise rejected so the caller doesn't think it
// succeeded when it actually failed
return $.Deferred().reject([jqXHR, textStatus, errorThrown]);
});
return p;
};
延迟对象不是这样工作的。相反,使用一个全局错误处理程序,然后为该ajax请求禁用全局事件。不要在此处使用
$.Deferred
接口。只需调用then
方法(或者在旧jQuery版本中调用pipe
),就可以得到$.ajax()
返回的承诺!有一个全局的,您可以使用它作为默认选项。ajaxrerror
不适用于我,因为它会激发所有请求,而不管是否有特殊处理。我知道现在这是标准的延迟行为,但是有没有一种简单的方法可以实现同样的效果呢?要么你想要一个默认的失败处理程序,要么你想要一个特定的失败处理程序。没有中途站!