Ale*_*ban 12 javascript jquery exception-handling callback
我想赶上从传递到jQuery的回调(无论是事件处理像抛出的异常click,或jqXHR方法,如then或always).
我发现了两个选择:
window.onerror 处理程序 - 这只是一个部分解决方案,因为在我的目标平台之一的Android上不支持它我能想到的唯一另一件事就是重写jQuery方法,但是每次升级jQuery都会导致问题.对于AJAX处理程序,我可以使用$ .ajaxSetup(根据jQuery AJAX回调吞下的异常的答案?)但我不确定这会让我抓住所有内容.
还有其他选择吗?
jfr*_*d00 15
您可以像这样包装每个回调:
function cbWrapper(fn) {
return function() {
try {
return(fn.apply(this, arguments));
} catch(e) {
// handle all your exceptions here
}
};
}
Run Code Online (Sandbox Code Playgroud)
因此,当您将回调传递给Ajax调用时,不是传递实际的回调,而是传递cbWrapper(callback).
$.get(url, cbWrapper(myRealCallback));
Run Code Online (Sandbox Code Playgroud)
或者内联匿名版本将是这样的:
$.get(url, cbWrapper(function() {
// actual callback code here
}));
Run Code Online (Sandbox Code Playgroud)
更高级的方法是$.get()使用自己的实现覆盖自动包装回调,但这很棘手,因为jQuery对于实际传递的参数非常灵活.因此,并且因为必须覆盖一个特定参数才能使其工作,所以必须复制它们的所有参数检测代码,以确定哪些参数存在以及哪些参数对应于哪些实际函数参数.那段代码有点乱.它是可行的,可能不会破坏,因为如果jQuery打破它,那么现有的jQuery代码会破坏,但它不是很干净.
如果它是你自己的所有代码,你可以使用自己的版本,$.get()使用参数位置不那么灵活,并切换所有代码以使用它而不是实际代码$.get():
jQuery.fn.myGet = function(url, fn) {
return(jQuery.get(url, cbWrapper(fn)));
}
Run Code Online (Sandbox Code Playgroud)