Javascript 在问题解决后,我可以强制jQuery/Ajax执行失败处理程序吗?

Javascript 在问题解决后,我可以强制jQuery/Ajax执行失败处理程序吗?,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,举个例子来说明我想做什么。这是我通常会做的: function success(data, status, jqxhr){ if ( data.error ) return failure(jqxhr, status, data.error); // process data } function failure(jqxhr, status, err){ ... } $.ajax( ... ) .done(success) .fail(failure) 有没有办法

举个例子来说明我想做什么。这是我通常会做的:

function success(data, status, jqxhr){
  if ( data.error )
    return failure(jqxhr, status, data.error);
  // process data
}
function failure(jqxhr, status, err){
  ...
}

$.ajax( ... )
  .done(success)
  .fail(failure)
有没有办法,我只能用匿名函数来实现这一点,就像这样

   $.ajax( ... )
      .done(function(data, status, jqxhr){
         if(data.error)
            // what do i need to do here to jump in to the fail handler?
      })
      .fail(function(jqxhr, status, err){
         ...
      })
我需要在这里做什么才能跳转到失败处理程序

不要使用
done
,而是使用
then
来映射承诺的结果。通过,您可以“抛出”错误并拒绝产生的承诺,以便执行失败处理程序

$.ajax(…)
  .then(function(data, status, jqxhr){
    if (data.error)
      return $.Deferred().reject(data.error);
    else
      return data; // if you want to return multiple arguments, you'd use
                   // $.Deferred().resolve(data, status, jqxhr);
  })
  .done(function(data) {
    …
  })
  .fail(function(jqxhr, status, err){
    …
  });

延迟对象的状态只能设置一次…我知道。还有什么方法可以强制执行失败处理程序吗?从技术上讲,您可以使用goto。但是在实践中最好不要这样做。使用
.always()
?@NabilKadimi,那么我需要额外的检查,无论是在成功还是失败后调用always,但这是一个想法。我知道,这必须是可能的!谢谢我遇到过
then
处理程序,但从未完全理解它的用途。但是当我们返回新的
$.Deferred()
对象时,我们失去了对
.abort()
方法
jqXHR
的访问权
$.Deferred()
对象没有它。@manakor:当您使用
然后
时,总是会丢失它,这与回调返回值无关。如果需要
abort
,请在将promise回调链接到
jqXHR
对象之前存储对该对象的引用。