为什么try catch能捕捉await后promise错误

21 min read

trycatch 语句可以捕获在 async 函数中使用 await 语句后的 Promise 的错误。这与 JavaScript 的执行栈有关。

JavaScript 的执行栈是一个堆栈,用于跟踪函数调用的顺序。每当 JavaScript 程序执行一个函数时,该函数会被推入执行栈,并在函数执行完成后弹出执行栈。

对于一个普通的 JavaScript 函数,当函数执行到 return 语句时,该函数就会被弹出执行栈。例如,下面的代码会打印出 "function A" 和 "function B":

function A() {
    console.log("function A");
    return B();
}

function B() {
    console.log("function B");
}

A();

然而,在 async 函数中使用 await 语句后的 Promise 就不同了。await 语句会暂停函数的执行,直到 Promise 被解决为止。例如,下面的代码会打印出 "function A",然后 1 秒后打印出 "function B":

async function A() {
    console.log("function A");
    await new Promise(resolve => setTimeout(resolve, 1000));
    return B();
}

function B() {
    console.log("function B");
}

A();

在这个例子中,A 函数并没有被弹出执行栈,而是在等待 Promise 被解决之后继续执行。

当在 async 函数中使用 await 语句后的 Promise 抛出错误时,可以使用 trycatch 语句来捕获错误。例如,下面的代码会在打印出 "function A" 后抛出一个错误:

async function A() {
    console.log("function A");
    await new Promise((resolve, reject) => reject(new Error("error in promise")));
    return B();
}

function B() {
    console.log("function B");
}

try {
    A();
} catch (err) {
    console.log(err);
}

上面的代码会打印出 "function A" 和 "error in promise"。

因此,使用 trycatch 语句可以捕获在 async 函数中使用 await 语句后的 Promise 的错误。这与 JavaScript 的执行栈有关,因为 await 语句会暂停函数的执行,直到 Promise 被解决为止。