我有一个$.ajax
承诺,想要检查我的(语法上有效的)响应是否包含错误,在这种情况下触发被拒绝的状态。
我使用自己的诺言库来轻松处理这些任务。我真的不喜欢jQuery的Promise(cache)实现及其Deferred
object并且可能忽略了一些东西,因为我很少使用它。我认为现在的方法就是使用.then()
,这似乎相当复杂:
return $.ajax(...).then(function success(response) {
var problem = hasError(response);
if (problem) {
var error = new $.Deferred;
error.reject(problem);
return error;
} else
return response;
});
这应该返回一个在网络错误或响应问题时被拒绝的承诺。但是回归被拒绝的推迟真的是[唯一|最好|最短]的方式去吗?
我也会在ajax选项中自己如何处理这些“错误抛出响应处理程序”的帮助,我找不到关于它们的好文档。
免责声明:不,我无法更改服务器响应。问题检测方法是同步的。我不想使用其他库,我对jQuery解决这个问题的方式特别感兴趣。
答案 0 :(得分:31)
现在针对jQuery 1.8 +
进行了更新解决此问题的最简单方法是运行$.ajax
到.then
的响应,根据数据的成功或失败进行过滤。
$.ajax()
.then(function (response) {
return $.Deferred(function (deferred) {
var problem = hasError(response);
if (problem) {
return deferred.reject(problem)
}
deferred.resolve(response);
}).promise();
});
然后,您可以将此新承诺返回给使用此代码的任何调用代码:
var request = function () {
return $.ajax()
.then(function (response) {
return $.Deferred(function (deferred) {
var problem = hasError(response);
if (problem) {
return deferred.reject(problem)
}
deferred.resolve(response);
}).promise();
});
};
request()
.done(function (response) {
// handle success
})
.fail(function (problem) {
// handle failure
});