【问题标题】:How to throw an error inside of a call back, and catch it outside如何在回调内部抛出错误,并在外部捕获它
【发布时间】:2017-06-11 07:17:33
【问题描述】:

简介

在这个 jQuery(document).ready() 函数内部,在匿名函数内部,我抛出了一个错误,该错误被第二个 catch 块捕获。然后我在那个 catch 块内抛出一个错误,并试图在第一个 try catch 块中捕获它。

问题。

  1. 这可能吗?浏览器控制台显示“未捕获”。
  2. 如果有,怎么可能?
  3. 任何其他信息将不胜感激 - 试图解决这个问题。
尝试 { // 绑定到就绪 jQuery(文档).ready(函数(){ 尝试 { throw Error("可以在这个 jquery 回调之外捕获吗?"); _this.initialize(); } 捕捉(e){ console.log(e.message + 'Caught inside callback'); throw Error(e.message + 'Not catch outside'); } }); } 捕捉(e){ //永远不会被执行。 控制台.log(e.message); }

【问题讨论】:

  • jsfiddle.net/a3vttpk6 中,“永不被执行”子句确实 被执行。这不是你想要的吗?
  • @RickHitchcock - 在那里困惑了一秒钟。请选择“Javascript - 加载类型 - 不换行”。
  • @Igor,啊!这确实有所作为。
  • @RichHitchcock - 这很奇怪,因为对我来说,在我的开发环境中它不会被执行。但是您的 jsfiddle 执行该行,但它是相同的代码。我想知道是否有其他原因导致它无法执行。我应该接受这个答案是正确的吗?
  • @Igor - Igor,我该怎么办?

标签: javascript try-catch


【解决方案1】:

$(document).ready 的事件处理程序与注册它们的代码异步执行 - 如果页面仍在加载,则在注册发生时。您的 function() { ... throw ... } 在外部 try/catch 块之外执行。你问的是不可能的。


@RickHitchcock 在https://jsfiddle.net/a3vttpk6/ 中观察到的行为解释(请参阅问题的第一条评论)

如果在 Rick 的小提琴中单击 Javascript 设置按钮,您将看到“加载类型”设置为“onLoad”。这意味着这个窗口中的整个 js 代码都包裹在window.onload = function() { ... } 中。这样做的结果是 - 立即执行 $(document).ready 处理程序,因为页面已经加载。如果您选择“不换行”设置 - 您将看到问题中描述的行为。

【讨论】:

  • 伊戈尔,请在您的回答中添加您关于 Rick Hitchcock 的 jsfiddle 的 cmets。
【解决方案2】:
let promise = new Promise((resolve, reject) => {
  jQuery(document).ready(() => {
    resolve('documentReady')
  });
})

promise.then((response) => {
  //run code here like you would in the ready callback
  throw Error("Can this be caught outside?");
}).catch(error => console.log(error, 'Caught you!'))

利用 Promise,我们可以在文档就绪事件触发后运行一个函数。如果有错误,我们可以抛出 Promise 捕获的错误。应该工作得很好。虽然从技术上讲不会从就绪回调中捕获错误,但它具有相同的功能。

要完全分离它,只需将一个变量分配给 promise.then() 并稍后用 .catch 引用它。

【讨论】:

  • 感谢您的观点。 Rick Hitchcock 的 jsfiddle 和 Igor 的评论起到了作用。 :)
猜你喜欢
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2012-07-27
  • 1970-01-01
  • 2014-07-26
  • 2020-06-20
相关资源
最近更新 更多