aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Phỏng vấn JavaScript: throw trong async function đi vào catch nào?

Suong Nguyen by Suong Nguyen
09/11/2026
in Phỏng vấn
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Một hàm được đổi sang async, nhưng test assert.throws không còn bắt được lỗi đầu vào. Trong thân hàm vẫn có throw và chưa đến bất kỳ await nào. Điểm cần nhìn là hợp đồng trả về đã đổi: lỗi không được bắt bên trong async function trở thành rejection của Promise mà lời gọi trả về.

Bài đối chiếu tài liệu ngày 09/11/2026 và chạy ví dụ bằng Node.js 24.18.1. Lưu các khối JavaScript dưới đây theo thứ tự vào file .mjs để dùng top-level await. Không gọi API, không sử dụng timer và không đo độ trễ của event loop.

Quan sát lỗi mà không tạo rejection bị bỏ quên

async function requirePositive(value) {
  if (!Number.isInteger(value) || value <= 0) {
    throw new RangeError('Expected a positive integer');
  }
  return value;
}

let caughtSynchronously = false;
let pending;
try {
  pending = requirePositive(0);
} catch {
  caughtSynchronously = true;
}
console.log(caughtSynchronously);
console.log(pending instanceof Promise);
console.log(await pending.then(
  () => 'fulfilled',
  error => error.name,
));

Kết quả là false, true và RangeError. Khối catch quanh lời gọi không nhận lỗi từ thân async function theo cách đồng bộ, nhưng Promise đã mang trạng thái lỗi. Ví dụ gắn hàm xử lý rejection ngay trong cùng lượt thực thi để quan sát nó; không cố ý để lỗi bị bỏ quên đến khi runtime báo unhandled rejection.

Async function trên MDN giải thích Promise được trả về và cách exception không được bắt trong thân hàm làm Promise bị reject. Điều này khác với nhận định sai rằng mọi dòng trong thân async đều bị trì hoãn sang một lúc khác: phần trước await đầu tiên vẫn có thể chạy ngay.

Await đưa rejection vào luồng try/catch đang chờ

Chạy tiếp trong cùng file:

try {
  const value = await requirePositive(0);
  console.log('accepted', value);
} catch (error) {
  console.log('await caught', error.name);
}

await requirePositive(0).catch(error => {
  console.log('promise catch', error.name);
});
console.log('valid', await requirePositive(3));

Ba dòng quan sát là await caught RangeError, promise catch RangeError và valid 3. Await nhận kết quả thành công hoặc làm lý do rejection xuất hiện như lỗi tại điểm đang chờ. Cách còn lại là xử lý bằng catch trên Promise.

Trong code sản phẩm, chọn chỗ xử lý theo trách nhiệm của tầng đang gọi. Nếu chỉ ghi log rồi bỏ qua, phía trên có thể hiểu thao tác đã hoàn tất thành công. Nếu cần chuyển lỗi thành một kết quả có trạng thái, định nghĩa cấu trúc ấy rõ ràng thay vì vô tình biến lỗi thành undefined.

Kiểm tra rejection bằng assertion đúng loại

import assert from 'node:assert/strict';

await assert.rejects(
  () => requirePositive(0),
  {name: 'RangeError', message: 'Expected a positive integer'},
);
assert.equal(await requirePositive(3), 3);
console.log('assertions passed');

Khối này đã đạt trên Node của bài. Node Assert mô tả assert.rejects cho trường hợp Promise bị từ chối. Không thay nó bằng assert.throws quanh lời gọi async chỉ vì bên trong hàm có từ khóa throw. Đồng thời, cần await assertion để quá trình kiểm tra chờ được kết quả lỗi mà nó đang xác nhận.

Giới hạn của câu nói “async trả Promise”

Kết luận trong bài áp dụng cho lỗi phát sinh trong thân async function khi hàm được gọi. JavaScript vẫn phải đánh giá biểu thức ở bên ngoài trước khi chuyển đối số vào hàm. Nếu một getter được dùng làm đối số tự ném lỗi ngay lúc truy cập, lỗi đó có thể nằm ngoài thân hàm và cần được phân tích riêng.

Tương tự, một hàm thông thường trả Promise không đồng nghĩa mọi validation trước khi return đều trở thành rejection. Khi review hoặc đổi API từ sync sang async, kiểm tra hợp đồng của chính hàm, không chỉ nhìn tên biến hoặc việc call site có dùng await.

Cách trả lời trong phỏng vấn

Hãy nêu ba điểm có thể kiểm chứng: lời gọi trả Promise, throw trong thân hàm dẫn đến rejection và caller cần await trong try/catch hoặc gắn handler tương ứng. Sau đó giải thích vì sao “chưa có await” không làm lời gọi quay lại hợp đồng ném lỗi đồng bộ của một hàm thường.

Thử thêm số âm, số thập phân và chuỗi '3'; chúng cần bị từ chối theo validation của ví dụ, còn số nguyên dương được resolve. Việc tách rõ lỗi đầu vào, cách truyền lỗi và chỗ xử lý giúp test mô tả đúng hành vi mà caller thực sự nhận được.

Nguồn tham khảo

  • MDN: async function
  • MDN: await
  • Node.js: assert.rejects

Tags: Async AwaitJavaScriptPhỏng vấn
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Phỏng vấn JavaScript: vì sao regex.test cùng chuỗi lại đổi kết quả?

by Suong Nguyen
08/11/2026
0

Theo dõi lastIndex của regex có cờ g, giải thích lỗi lọc dữ liệu bị bỏ xen kẽ và viết validator không giữ con trỏ tìm kiếm.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

JavaScript Set với object: cùng id vẫn có thể là hai phần tử

by Suong Nguyen
07/11/2026
0

Phân biệt trùng tham chiếu với trùng khóa nghiệp vụ, rồi viết phép loại trùng theo id với chính sách giữ bản ghi đầu tiên.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Array.reduce thiếu initialValue: mảng rỗng lỗi, một phần tử không gọi callback

by Suong Nguyen
06/11/2026
0

Theo dõi accumulator và chỉ số callback để chọn initialValue đúng kiểu, thay vì chỉ thêm 0 cho hết lỗi mảng rỗng.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Destructuring default: vì sao undefined nhận mặc định còn null thì không?

by Suong Nguyen
05/11/2026
0

Phân biệt default của thuộc tính với default của cả tham số và kiểm tra các trường hợp null, undefined, 0 và chuỗi rỗng.

Next Post
Minh hoạ style và layout trong React Native với màn hình mobile, spacing và typography

React Native ScrollView: đặt style cho khung cuộn hay vùng nội dung?

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native ScrollView: đặt style cho khung cuộn hay vùng nội dung?
  • Phỏng vấn JavaScript: throw trong async function đi vào catch nào?
  • Android CheckBox: đổi isChecked bằng code vẫn có thể gọi listener

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply