【问题标题】:How to trigger "fail" handlers on an Ajax Promise?如何在 Ajax Promise 上触发“失败”处理程序?
【发布时间】:2025-12-11 08:45:02
【问题描述】:

如何强制来自$.ajax 的成功响应以从“完成”处理程序中触发其“失败”处理程序?

jQuery documentation 表示 jqXHR 对象实现了 Promise 接口,这意味着它没有 reject 方法。

下面显示了一些代码,用于侦听在另一个范围内创建的 jqXHR 对象上的故障。

如果成功的响应实际上是格式正确的错误,我想触发正在侦听“失败”的处理程序。

// common function
function doAjax(options) {
  return $.ajax(options).fail(function() {
    // common error handling
  }.done(function(result, status, xhr) {
    if (result.isBAD) {
      xhr.reject(); // <- not a jqXHR method
    }
  }));
}

// listening elsewhere
doAjax(options).fail(function() {
  // specific error handling
});

【问题讨论】:

  • 我不相信你可以。鉴于 done/fail 旨在处理请求的状态,而不是其内容,因此您尝试创建的逻辑违反了该原则。
  • 也许 doAjax 函数可以返回自定义的 Deferred 对象?
  • 我猜这意味着客户端代码无法访问原始 XMLHttpRequest,但我可能能够忍受
  • 是的,您可以返回您自己的承诺/推迟选择解决/拒绝的案例。
  • 可能的相同问题:*.com/questions/17800176/…

标签: javascript jquery ajax


【解决方案1】:

我通过返回我自己的承诺而不是 jqXHR 实例来解决这个问题。这意味着客户端代码无法访问其他 ajax 详细信息,但在我的情况下这不是问题。

function doAjax(options) {
  var deferred = $.Deferred();
  return $.ajax(options)
    .fail( function() {
      deferred.reject();
    })
    .done( function(result,status,xhr) {
      if( result.isBAD ){
        deferred.reject();
      }else {
        deferred.resolve();
      }
    })
  ;
  return deferred.promise();
}

【讨论】: