jquery - 错误处理jQuery AJAX Promise与Q

标签 jquery ajax error-handling promise q

我在AJAX中使用jQuery,但在应用程序中的其他地方使用了Q,因此希望确保Promise实现的一致性。

我用Q包裹了jQuery AJAX调用,如下所示:

Q($.ajax(url, {
  type: 'get'
}));

对于成功的响应,一切正常。现在,我要添加错误处理,我要进行全局错误处理(因为我们从服务器收到一致的错误响应),因此制作了一个API,如下所示:
var xhr = function (url) {
    return Q($.ajax(url, {
      type: 'get'
    }))
    .then(function (data) {
      return data;
    }, function (res) {
      //global error handling
    });
};

我希望这样使用它:
xhr('...').then(function () { console.log('success'); });

问题是当全局错误处理程序在xhr方法的使用者使用时运行“成功”方法时。

您将如何预防?

可以在此处看到可运行的示例-http://jsbin.com/gudifu/3/edit

最佳答案

由于jQuery的标准 promise ,您必须跳过圈将错误传递给Q强制 promise 。

首先,jqXHR的错误签名为(jqXHR, textStatus, errorThrown),并且您通常希望传递第二个参数textStatus

其次,这两个promise实现在错误处理方面有很大不同:

  • jQuery :传播错误状态,除非从.then()错误回调返回了新的,已解决的 promise 。保证.fail()传播错误状态,而不管返回什么。未捕获的throw将终止事件线程。
  • Q :除非将.catch().fail().then()错误回调改写错误或抛出新错误,否则将错误标记为“已处理”(即,将错误发送到成功路径),在这种情况下,promise会沿着错误路径继续。

  • 因此,您需要:
  • .then(null, errHandler)链接到您的jQuery.ajax()调用中,以便报告textStatus
  • 基于jQuery错误
  • 从Q抛出错误

    var xhr = function (url) {
        return Q($.ajax(url, {
          type: 'get'
        }).then(null, function(jqXHR, textStatus, errorThrown) {
            return textStatus;
        })).then(function (data) {
            return data;
        }, function (textStatus) {
          //global error handling
          throw new Error(textStatus);
        });
    };
    

    您也可以从jQuery抛出适当的错误,然后从Q重新抛出错误。
    var xhr = function (url) {
        return Q($.ajax(url, {
          type: 'get'
        }).then(null, function(jqXHR, textStatus, errorThrown) {
            return new Error(textStatus);
        })).then(function (data) {
            return data;
        }, function (err) {
          //global error handling
          throw err;
        });
    };
    

    两种解决方案的净效果几乎相同。我想我说的很对,如果记录了错误,它们将显示不同的错误行号-前者源自Q,后者源自jQuery。

    关于jquery - 错误处理jQuery AJAX Promise与Q,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29024611/

    相关文章:

    javascript - 在 jquery 中检查图像源是否有图像

    javascript - jQuery Ajax意外的 token <404错误,而不是正常的Ajax错误处理函数

    c# - MVC 全局错误处理 : Application_Error not firing

    jquery - 滚动过去后如何使 div 内的元素变粘?

    javascript - 如何将 'x' 个 <td> 元素添加到 for 循环中的 <tr> 元素中? [jQuery]

    c# - HTMLAgilityPack 加载 AJAX 内容以进行抓取

    php - Symfony2 : Prevent duplicate in database with form Many to One

    php - 使用 AJAX 从 PHP 文件获取响应

    vb.net - 如何处理跨线程操作中的错误

    javascript - 准备好功能后,Jquery 加载无法在 Internet Explorer 上运行