我经常发现自己合并 jQuery ajax 错误和成功结果类似于以下内容:
$.ajax(
success: function (response, statusText, xhr) {
handleResponse(true, xhr, statusText, response, callback);
},
error: function (xhr, statusText, response) {
handleResponse(false, xhr, statusText, response, callback);
});
这通常是因为无论结果如何,都需要处理状态更改,但取决于它 - 更清楚地表明此状态更改仅被调用一次。此外,我经常根据特定的响应内容(例如 JSON 结果中包含的错误)将某些“成功”响应重新分配给错误处理。我还可以从某些类型的错误中整合成功类型的操作。当这些关注点相互影响时,它特别提高了整合的清晰度。
我的主要问题是,有没有更好的方法来处理这种错误/成功合并?
一个相关的问题是,jQuery 作者是否出于某种原因故意使这种使用变得不可访问,例如通过更改成功/错误回调之间的参数顺序,并且不提供isSuccess
对 jqXhr 结果中的内部结果的访问?
编辑:我知道这个complete
选项(类似于always()
我在标题中提到的延迟)。但是,它不提供对成功/错误 HTTP 状态代码汇总的访问(isSuccess
在上面提到的 jQuery 内部),也不在成功时反序列化 JSON。
编辑 2:我刚刚发现了jqXHR.isResolved()
可用于测试 xhr 成功状态的出色功能,它只剩下手动反序列化响应。不幸的是,它被列为不推荐使用,尽管 jQuery 仍在内部使用它。
编辑 3:来自deferred
原型的 jqXHR.state() 似乎在从.always()
. 它看起来有点冒险,就像在处理事件时没有按设计顺序保证此状态的值。所以也许会发生变化。此外,.always()
以这种方式使用仍然让我手动反序列化/解释接收到的数据。
也许你认为我想这样做很疯狂。也许你是对的;你是法官。目前有我备份的示例是我正在尝试向我的 ajax 调用添加一个透明的身份验证重试队列:
this.exec = function (callback, parameters) {
queue.add({
url: settings.url,
type: settings.post ? 'POST' : 'GET',
data: parameters && parseInt(parameters) == parameters ? { id: parameters } : parameters,
success: function (response, statusText, xhr) {
handleResponse(true, xhr, statusText, response, callback);
},
error: function (xhr, statusText, response) {
handleResponse(false, xhr, statusText, response, callback);
}
});
}
function handleResponse(success, xhr, statusText, response, callback) {
if (settings.authRetry && xhr.status == 401) {
authRetryQueue.notify(xhr);
}
else {
queue.remove(xhr);
if (callback) {
if (success) {
if (xhr.method == 'GET' || response.StatusText == null || response.StatusText == 'success')
callback(true, settings.Model ? new settings.Model(response) : response);
else callback(false, response.StatusText);
}
else {
callback(false, response);
}
}
}
}