【问题标题】:$(document).ajaxError is not firing on 401$(document).ajaxError 没有在 401 上触发
【发布时间】:2019-05-27 19:34:37
【问题描述】:

我们有一个错误处理程序来发布消息。

 $(document).ajaxError(function (e, xhr, options) {
  window.postMessage(....);  
});

其中一个 fetch 调用返回 401

this.fetch = function(url) {
return fetch(url, { 
  }
}).then(function(response) {
  return response.json();
})

当我检查响应时,状态为 401,但 response.json() 正在抛出“Uncaught (in promise) SyntaxError: Unexpected end of JSON input.” 因此,ajaxError 没有触发。

预期行为:如果我没有从 fetch 调用中获得状态 200,我希望 document.ajaxError 发布消息。

我们有一个 wrapper.js,它具有覆盖函数

 window.fetch = (function(arg) {


 }(window.fetch)

我可以在这个函数中全局捕获这个异常吗?

【问题讨论】:

  • 如果 jQuery 能够捕获 fetch ajax 调用错误,我会感到惊讶,因为它并非源自 jQuery
  • jsfiddle.net/uxbcLajt 是的,看起来 ajaxError 不会捕获非来自 jQuery 的 ajax 请求的错误
  • 另一件事是fetch不会在401上失败,这意味着它将进入.then回调。当来自 jQuery 的 ajax 或 axios 时,这是违反直觉的。你应该检查response.ok,如果false,你需要手动拒绝。
  • @Taplar 我已对问题描述进行了编辑。您认为这可以在 window.fetch 中全局处理吗?
  • 我不清楚该包装器如何改变 ajax 并非源自 jQuery 的事实。编辑:这似乎也是一个逻辑错误,因为您试图定义一个变量,同时还试图将它传递给旨在定义它的 IIFE。

标签: javascript jquery ajax backbone.js chaplinjs


【解决方案1】:

根据 cmets,我无法在 ajaxError 处理程序上执行此操作,因为它不是源自 jquery。 我能够在 Window.fetch 包装器中做到这一点

 window.fetch = (function (original)) {
  ...............

  return original.apply(this, args).then(function (response)) {

      if(response.status !== 200)
       {
           window.postMessage({ event_type: 'request:failed', status: response.status); 
       }   
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多