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