finally的执行时机

# 同步代码场景

try {
  console.log("try 同步代码");
} finally {
  console.log("finally 同步执行");
}
// 输出:
//   try 同步代码
//   finally 同步执行

1
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
  • 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
  • 当 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
  • 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