如果回调可能需要拒绝它,我可以手动解析延迟对象吗?

我正在尝试使用自定义延迟对象来管理一些回调。 我弄清楚了这个简单的案例:

var deferred = $.Deferred(); deferred.done(function() { console.log( 'done' ); }); var json = $.getJSON('/foo'); json.then( function() { deferred.resolveWith(this, arguments); } ); 

但我需要在解决/拒绝之前检查响应。 我想添加这样的东西:

 deferred.pipe( function(response) { if (response.message === 'error') { return $.Deferred.reject(response); } return response; } ); 

但是当我这样做时,我总是调用我原来的done()回调。 我很确定这是因为一旦我调用deferred.resolveWith() ,“回滚”并将其标记为稍后被拒绝为时已晚。 我知道我可以将条件移动到json.then()的第一个参数,但这似乎忽略了延迟对象的意义 – 我认为它们是用于将所有这些行为封装到一个地方。

是否有可能将条件和回调都deferred同时仍在其他地方解决它?

看起来你的目标实际上只是将function分成两个步骤:validationajax请求的结果,然后处理结果。 为此,请将外部延迟替换为基于ajax请求返回的参数解析或拒绝的内部延迟。

 var deferred = $.Deferred(); deferred.then(function(data){ // new deferred that we will be returning var deferred = $.Deferred(); if (data.success == true) { deferred.resolveWith(data.result); } else { deferred.rejectWith(data.error); } // any following chained methods will affect this returned deferred object return deferred; }).then( // done callback function(result){ console.log("Resolved!"); console.dir(result); }, // fail callback function(error){ console.log("Rejected!"); console.dir(error) } ); var json = $.getJSON("/foo"); json.done(deferred.resolveWith);