gpt4 book ai didi

javascript - 带有回调函数的异步 JavaScript 的 Try/catch block

转载 作者:行者123 更新时间:2023-11-30 11:20:28 24 4
gpt4 key购买 nike

我有一段代码:

function backgroundReadFile(url, callback) {
var req = new XMLHttpRequest();
req.open("GET", url, true);
req.addEventListener("load", function() {
if (req.status < 400)
callback(req.responseText);
});
req.send(null);
}
try {
backgroundReadFile("example/data.txt", function(text) {
if (text != "expected")
throw new Error("That was unexpected");
});
} catch (e) {
console.log("Hello from the catch block");
}

在我的控制台中我得到

Error: That was unexpected (line 13)

这很好。但是,有人告诉我:

In the code, the exception will not be caught because the call to backgroundReadFile returns immediately. Control then leaves the try block, and the function it was given won’t be called until later.

问题是:为什么其他错误不会在这里被捕获?当我们遇到连接问题或文件不存在时?据我所知,如果

,回调函数将不会执行
req.addEventListener("load") 
例如,

不会被触发。但它仍然存在 - 我仍然遇到同样的错误 - 错误:这是意外的(第 13 行)

这是什么意思 - “不会捕获异常,因为对 backgroundReadFile 的调用会立即返回”?

谢谢。

最佳答案

这是对您的代码中发生的事情的逐步分解。

  1. 代码进入try-catch block 。
  2. backgroundReadFile 被调用,带有两个参数:"example/data.txt" 和一个匿名函数。
  3. backgroundReadFile 创建一个 AJAX 请求并调用 send()。这就是异步概念发挥作用的地方:实际的 HTTP 请求不会立即发送,而是放在队列中,以便在浏览器完成运行它正在运行的任何代码后立即执行时刻(即您的 try-ctach block )。
  4. backgroundReadFile 就这样完成了。执行返回到 try-catch block 。
  5. 没有遇到异常,因此跳过 catch block 。
  6. 包含 try-catch block 的代码已完成执行。 现在浏览器可以继续执行队列中的第一个异步操作,即您的 AJAX 请求。
  7. 发送 HTTP 请求,一旦收到响应,就会触发 onload 事件处理程序——无论响应是什么(即成功或错误)。
  8. 您传递给 backgroundReadFile 的匿名函数作为 onload 事件处理程序的一部分被调用,并抛出一个 Error。但是,正如您现在看到的,您的代码不再在 try-catch block 中,因此没有被捕获。

TL;DR:抛出错误的函数在 try-catch block 内定义,但在其外执行

此外,AJAX 请求中的错误处理有两个方面:连接错误和服务器端错误。连接错误可能是请求超时或发送请求时可能发生的其他随机错误;这些可以分别在 ontimeoutonerror 事件处理程序中处理。但是,如果 HTTP 请求到达服务器并收到响应,那么就 XMLHttpRequest 而言,请求成功。由您来检查,例如 XMLHttpRequeststatus 属性(其中包含 HTTP 响应代码,例如 200 表示“OK”,404 表示“未找到” "等),判断是否成功。

关于javascript - 带有回调函数的异步 JavaScript 的 Try/catch block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50022457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com