async function foo() {
try {
const response = await fetch("https://www.xxx.xxx");
const data = await response.json();
console.log(data);
} catch (e) {
console.log("Error!!: ", e);
}
}
foo();
console.log('111');
假设有这样一段代码,执行结果是
111 -> 错误:类型错误:无法获取
这就是当我考虑执行上下文过程时发生的情况,具体取决于代码流程
当调用 foo 函数时,会创建 foo 函数的执行上下文并添加到调用堆栈中。
当 fetch("https://www.xxx.xxx ") 在 try 块内运行时,会创建 fetch 函数的执行上下文并将其添加到调用堆栈中。这是在后台发出网络请求的时间。 fetch 函数返回一个 Promise,并且 fetch 函数的执行上下文将从调用堆栈中删除。
await 关键字之后的后续操作将添加到微任务队列中。
foo 函数结束,从调用堆栈中删除 foo 函数的执行上下文。
执行console.log('111),控制台输出“111”。
由于调用栈为空,所以在await之后的后续在微任务队列中排队的操作会依次移至调用栈并执行。
fetch函数的网络请求失败,调用了reject,导致Promise的状态为rejected。
如何捕获错误???
try/catch 语句有点令人困惑。
为了让console.log('111)运行,调用栈必须为空,但是已经结束的foo函数中的catch怎么会出错呢??
请帮助我!
我想这可能会帮助你理解:
由于您的
foo()
是异步的,因此 await
之后的所有内容都是异步执行的,因此在 console.log('111')
之后是同步的。所以使用await foo()
等待foo()
解决后再解决console.log('111')
:
async function foo() {
try {
const response = await fetch("https://www.xxx.xxx");
const data = await response.json();
console.log(data);
} catch (e) {
console.log("Error!!: ", e);
}
}
(async() => {
await foo();
console.log('111');
})();
也许这几点可以帮助你:
console.log(111)
在 foo()
承诺完成之前被调用。foo()
抛出的错误,您需要添加.catch(err => ...)
注意,您可以在调用 foo 之前添加
await
,以便在之后进行顺序调用,因此 console.log(111) 将在 Promise 完成后被调用