如何捕获传递给jQuery的回调中抛出的异常
How to catch exceptions thrown in callbacks passed to jQuery?
我想捕获从传递给jQuery的回调中抛出的异常(要么传递给像click
这样的事件处理程序,要么传递给then
或always
这样的jqXHR方法)。
我已经确定了两个选项:
window.onerror
处理程序-这只是部分解决方案,因为我的目标平台之一Android不支持它- 在每个单独的回调中处理异常-根本不是DRY
我唯一能想到的另一件事是重写jQuery方法,但这可能会在我升级jQuery时导致问题。对于AJAX处理程序,我可能会使用$.ajaxSetup(根据jQueryAJAX回调中抛出的异常的答案?),但我不确定这是否能让我捕获所有内容。
还有其他选择吗?
您可以这样包装每个回调:
function cbWrapper(fn) {
return function() {
try {
return(fn.apply(this, arguments));
} catch(e) {
// handle all your exceptions here
}
};
}
因此,当您将回调传递给Ajax调用时,您将传递cbWrapper(callback)
,而不是传递实际的回调。
$.get(url, cbWrapper(myRealCallback));
或者内联匿名版本是这样的:
$.get(url, cbWrapper(function() {
// actual callback code here
}));
一种更高级的方法是用自己的实现覆盖$.get()
,该实现自动包装回调,但这会很棘手,因为jQuery在实际传递的参数方面非常灵活。正因为如此,而且你必须重写一个特定的参数才能实现这一点,你必须复制他们所有的参数检测代码,以确定哪些参数存在,哪些参数对应于哪些实际的函数参数。那个代码有点乱。它是可行的,而且可能不会中断,因为如果jQuery中断了它,那么现有的jQuery代码就会中断,但它不是很干净。
如果这都是你自己的代码,你可以制作你自己的$.get()
版本,它在参数位置上不那么灵活,并将所有代码切换为使用它,而不是实际的$.get()
:
jQuery.fn.myGet = function(url, fn) {
return(jQuery.get(url, cbWrapper(fn)));
}
相关文章:
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- Meteor:异步函数回调异常:onAfterAction
- jQuery deferred:在fail()回调中抛出并捕获异常
- 与在异步回调链中使用 try catch 块相比,返回异常有什么优势
- 异步函数的 JavaScript 回调:是否有任何模式可以区分“返回值”和“异常”
- JavaScript:如何使用在回调中抑制异常的库
- 将gullow回调直接传递给promise时出现异常
- 异常捕获在功能上是否与承诺错误回调相同
- 如何捕获传递给jQuery的回调中抛出的异常
- 延迟回调中出现异常:错误:没有这样的模板:wiki
- 节点样式回调:完成(异常)或抛出异常
- 在Web Worker onmessage回调中调用postMessage会引发SYNTAX_ERR:DOM异常12
- ExtJS 4 - callParent的异步回调抛出异常
- 延迟回调中的异常:错误:路由器上没有配置uiManager
- 如何在回调中正确抛出异常
- 在回调中调用yield, redux saga给出了一个异常原因
- 流星邮件-同步Cron - setTimeout回调异常:TypeError:不能调用方法'getTime
- Q中的静默异常:然后回调
- 回调异常[TypeError: listener必须是一个函数]