在jQuery的Deferred对象中抛出一个错误

我有一个$.ajax承诺,并希望检查我的(语法有效)响应是否包含错误,在这种情况下触发拒绝状态。

我曾经和我自己的承诺库很容易地处理这些任务。 我真的不喜欢jQuery的Promise ( caching )实现与Deferred对象 ,可能忽略了一些东西,因为我很less使用它。 我认为要走的路只是使用.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; }); 

这应该返回一个承诺,在networking错误或响应问题的情况下被拒绝。 但是是否真的返回被拒绝的方式呢?

我也会在如何处理这些“错误抛出响应处理程序”的ajax选项本身提供帮助,我找不到有关它们的好文档。


免责声明:不,我不能改变服务器的回应。 问题检测方法是同步的。 我不想使用其他库,我对jQuery解决这个问题的方式特别感兴趣。

现在更新为jQuery 1.8+

解决这个问题的最简单方法是运行$.ajax的响应,然后根据数据的成功或失败进行过滤。

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