【问题标题】:Can I force jQuery Deferred/Ajax to execute fail handler after it has been resolved?解决后,我可以强制 jQuery Deferred/Ajax 执行失败处理程序吗?
【发布时间】:2014-02-02 08:22:40
【问题描述】:

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

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){
         ...
      })

【问题讨论】:

  • 延迟对象的状态只能设置一次......
  • 我知道。还有什么方法可以强制执行失败处理程序吗?
  • 从技术上讲,您可以使用 goto。但实际上最好不要这样做
  • .always()怎么样?
  • @NabilKadimi,那么我需要额外的检查,无论是否总是在成功或失败后被调用,但这是一个想法

标签: javascript jquery jquery-deferred


【解决方案1】:

我需要在这里做什么才能跳转到失败处理程序?

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

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

【讨论】:

  • 我知道,这一定是可能的!谢谢。我遇到过then 处理程序,但从未完全理解它的用途。
  • 但是当我们返回新的$.Deferred() 对象时,我们失去了对.abort() 方法jqXHR 的访问权限吗? $.Deferred() 对象没有它。
  • @manakor:当您使用then 时,您总是会松懈,这与回调返回值没有任何关系。如果您需要abort,请在将承诺回调链接到它之前存储对jqXHR 对象的引用。
猜你喜欢
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多