jQuery 延迟对象集中式全局错误处理程序

jQuery Deferred object centralized global error handler

Deferred 对象内部发生的错误会向控制台发出警告,但不会在以下位置引起注意:

    window.addEventListener("error", function(e) {
       // Global handler
    });

如何使集中式错误处理程序适用于所有错误,包括延迟对象?

我使用的是最新的 jQuery 3.3.1,但找不到可用的解决方案。

如果您将 jquery 用于 ajax 请求,您可以这样做:

$(document).ajaxError(function(){
   console.log(arguments);
}

阅读 jQuery 3.3.1 (第 3605 行) 后,他们实际上实现了 $.Deferred.exceptionHook 在延迟对象失败时调用。

对于你的情况,你只需要像这样实现它,

$.Deferred.exceptionHook = function (err, stackTrace) {
  // 'err' is what you throw in your deferred's catch.
  window.dispatchEvent( new CustomEvent('error', {
    detail: err
  }) );
}

这是一些简单的例子。

$.Deferred.exceptionHook = function (err, stackTrace) {
  // 'err' is what you throw in your deferred's catch.
  $("#errorMessage").text(err);
}

$.when(
  $.ajax( "https://example.com" ) // This should fail since SO is sandboxed.
).then(function successFn() {
  alert("Impossible thing is happening");
}, function failFn() {
  throw "A nice error";
});
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<p id="errorMessage">
  
</p>