finally的执行时机
# 同步代码场景
try {
console.log("try 同步代码");
} finally {
console.log("finally 同步执行");
}
// 输出:
// try 同步代码
// finally 同步执行
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- try 中的同步代码执行完毕后,finally 立即执行。
# 异步任务场景(如 setTimeout、Promise)
try {
setTimeout(() => {
console.log("try 异步回调");
}, 1000);
console.log("try 同步部分结束");
} finally {
console.log("finally 立即执行");
}
// 输出(约1秒后):
// try 同步部分结束
// finally 立即执行
// try 异步回调(约1秒后)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- try 块中的 setTimeout 仅启动了异步任务,不会阻塞 try 的执行。
- finally 在 try 的同步代码执行完毕后立即执行,不会等待 setTimeout 的回调。
# async/await 场景
async function asyncTask() {
try {
await new Promise((resolve) => setTimeout(resolve, 1000));
console.log("try 异步完成");
} finally {
console.log("finally 等待异步完成");
}
}
asyncTask();
// 输出(约1秒后):
// try 异步完成
// finally 等待异步完成
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 当 try 块中使用 await 时,await 会暂停 async 函数的执行,直到 Promise 完成。
- finally 会在 await 的 Promise 完成后执行,因为 await 将异步操作转换为“同步风格”的等待。
# 异常场景
try {
Promise.reject("错误").catch((err) => console.log("捕获错误: " + err));
} finally {
console.log("finally 执行(不关心异步错误)");
}
// 输出:
// finally 执行(不关心异步错误)
// 捕获错误: 错误
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- try 中的异步错误(如未处理的 Promise.reject)不会阻止 finally 执行。
- 异步错误需要自身通过 .catch() 或 try...catch 处理,finally 不处理异步错误
最近更新时间: 2025/11/10 09:52:46
- 01
- 2025/10/01 00:00:00
- 02
- 2025/09/15 00:00:00
- 03
- 2025/08/20 00:00:00