gpt4 book ai didi

javascript - 为 jQuery 延迟对象提供默认的 'fail' 方法

转载 作者:数据小太阳 更新时间:2023-10-29 05:30:03 28 4
gpt4 key购买 nike

我正在使用 jQuery 编写一个 Javascript API 客户端。我的顶级请求方法如下所示:

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();
},

如何为我返回的 deferred 设置默认的 fail 处理程序?也就是说,如果 deferred 没有附加到它的 fail 条件的其他处理程序,则调用默认处理程序。

我想这样做是为了在我的应用程序中进行全局异常处理,但具有特定处理的部分除外(并将在 deferred 上定义它们自己的 fail 处理程序)。

最佳答案

因此,截至 2016 年,在 API 中使用 jQuery ajax 的最简洁方法是返回 promise 。但是,您无法确定调用方是否已将错误处理程序附加到 promise 。

因此,我建议您只需向函数添加一个新参数,告诉函数不要应用默认错误处理,因为调用者将负责错误处理。而且,我建议您通过使用现有的 promise $.ajax() 已经返回而不是创建您自己的延迟来避免 promise 反模式:

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
});

或者,您可以使用传入的非 promise failHandler 回调,您的默认错误处理会查看是否传入了 failHandler。这是 promises 和回调的混合体,不是我通常会选择架构的东西,但由于你的问题要求的是 promises 不支持的东西,这是实现这一目标的方法之一:

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;
};

关于javascript - 为 jQuery 延迟对象提供默认的 'fail' 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19101670/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com