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

Promise.all và allSettled: chờ kết quả không có nghĩa là tự hủy tác vụ

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

Câu hỏi “một request trong Promise.all thất bại thì chuyện gì xảy ra?” thường nhận câu trả lời quá ngắn: tất cả dừng lại. Thực tế, promise tổng hợp có thể reject trong khi công việc khác vẫn tiếp tục. Nhầm lẫn này gây lỗi khi xử lý upload, lưu dữ liệu hoặc tải nhiều phần của một màn hình.

Bài này dùng các promise tự điều khiển để thấy rõ hành vi mà không phụ thuộc mạng hay thời gian chờ. Hai ví dụ đã chạy bằng Node.js 24.18.1 dưới dạng file .mjs. Tài liệu MDN được đối chiếu ngày 24/10/2026. Đây là kiểm tra ngữ nghĩa JavaScript, không phải đo hiệu năng request đồng thời.

1. Promise.all tạo một kết quả chung

Theo tham chiếu Promise.all, promise tổng hợp fulfill khi tất cả đầu vào fulfill, hoặc reject khi một đầu vào reject. Khi thành công, mảng kết quả giữ thứ tự đầu vào, không xếp theo tác vụ hoàn thành trước.

Điều này phù hợp khi bước sau cần toàn bộ dữ liệu. Ví dụ, bạn chỉ dựng một báo cáo hoàn chỉnh khi các phần bắt buộc đều có. Nhưng reject của kết quả chung không tự gửi tín hiệu hủy tới các công việc đã bắt đầu, và không hoàn tác tác dụng phụ đã xảy ra.

2. Chứng minh công việc còn lại vẫn tiếp tục

Lưu thành all-demo.mjs rồi chạy node all-demo.mjs:

let finishSlow;
const slow = new Promise((resolve) => {
  finishSlow = resolve;
});

const batch = Promise.all([
  Promise.reject(new Error('A failed')),
  slow,
]);

try {
  await batch;
} catch (error) {
  console.log(error.message);
}

finishSlow('B done');
console.log(await slow);

Output đã kiểm tra là A failed, rồi B done, mỗi chuỗi trên một dòng. Promise slow vẫn có thể được resolve sau khi batch đã reject. Ta chủ động điều khiển thời điểm hoàn thành thay vì dùng hai timer rồi đoán tác vụ nào nhanh hơn.

Trong code gọi mạng, muốn hủy request phải dùng cơ chế hủy mà thao tác đó hỗ trợ, chẳng hạn một tín hiệu abort được truyền và được xử lý đúng. Promise combinator không cung cấp cơ chế hủy phổ quát cho mọi loại công việc. Ngay cả khi request client được hủy, cũng cần hiểu server có thể đã nhận và thực hiện công việc.

3. allSettled giữ từng kết quả để bạn quyết định

Promise.allSettled chờ mọi đầu vào kết thúc và trả các bản ghi có status. Bản ghi fulfilled có value, bản ghi rejected có reason. Mảng vẫn theo thứ tự đầu vào.

Lưu đoạn sau thành settled-demo.mjs:

let finishFirst;
const first = new Promise((resolve) => {
  finishFirst = resolve;
});
const second = Promise.resolve('second');
const third = Promise.reject(new Error('third failed'));

const batch = Promise.allSettled([first, second, third]);
finishFirst('first');

const results = await batch;
for (const [index, result] of results.entries()) {
  if (result.status === 'fulfilled') {
    console.log(index, 'ok', result.value);
  } else {
    console.log(index, 'error', result.reason.message);
  }
}

Kết quả đã chạy là 0 ok first, 1 ok second, 2 error third failed. Dù đầu vào thứ hai đã fulfilled trước đầu vào thứ nhất, vị trí kết quả không đổi. Việc gắn kết quả về đúng mục gốc vẫn cần ID hoặc index đáng tin cậy trong ứng dụng của bạn.

4. Chọn theo chính sách lỗi

Nếu màn hình cho phép một khối thông tin lỗi nhưng khối khác vẫn hiển thị, allSettled có thể giúp thu đủ tình trạng để dựng UI. Tuy nhiên, bạn vẫn phải đọc từng status và quyết định retry, thông báo hay bỏ qua theo nghiệp vụ. Chờ tất cả xong rồi không xử lý rejected chỉ làm lỗi bị che đi.

Nếu thiếu một phần bắt buộc thì toàn bộ bước sau không có ý nghĩa, all với catch ở ranh giới phù hợp thường mô tả ý định rõ hơn. Hãy hỏi thêm việc phụ nào vẫn được phép tiếp tục khi kết quả chung thất bại và bên nào có trách nhiệm hủy nó.

Cả hai không phải hàng đợi giới hạn số tác vụ. Với items.map(item => doWork(item)), các lời gọi doWork đã được thực hiện trong quá trình map. Đưa mảng đó vào allSettled không tự biến một nghìn công việc thành nhóm năm công việc mỗi lượt. Muốn giới hạn tải cần một thiết kế điều phối riêng.

Kiểm tra và lỗi thường gặp

Lỗi thứ nhất là await trực tiếp mảng do map(async ...) trả về rồi tưởng đã nhận mảng kết quả. Hãy xác định biến đang chứa promise hay mảng promise và dùng combinator theo ý định. Lỗi thứ hai là lấy mọi result.value từ allSettled mà không phân nhánh status.

Lỗi thứ ba là viết catch cho all rồi giả định không còn công việc nào có thể ghi dữ liệu. Khi có side effect, kiểm tra cả cơ chế hủy và hành vi phục hồi của tác vụ. Cuối cùng, đừng dùng for...of có await bên trong rồi gọi nó là chạy song song; mỗi lượt vòng lặp đang chờ lượt trước hoàn thành.

Gợi ý trả lời phỏng vấn

Hãy trình bày điều kiện hoàn thành, hình dạng kết quả, thứ tự và chính sách lỗi. Sau đó nêu rõ combinator không tự hủy tác vụ hay rollback dữ liệu. Hai ví dụ có thể chạy ở trên giúp bạn chứng minh câu trả lời thay vì chỉ nhắc lại tên “fail fast”.

Nguồn tham khảo

  • MDN: Promise.all
  • MDN: Promise.allSettled

Tags: JavaScriptPhỏng vấnPromise
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 spread vẫn có thể làm đổi object gốc?

by Suong Nguyen
23/10/2026
0

Luyện cách giải thích shallow copy, so sánh tham chiếu và cập nhật một nhánh dữ liệu mà vẫn giữ object ban đầu.

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: giải thích event loop, microtask và async/await

by Suong Nguyen
22/10/2026
0

Luyện cách giải thích thứ tự chạy của Promise, timer và await thay vì chỉ học thuộc đáp án in ra màn hình.

Minh hoạ state thay đổi và làm giao diện React Native cập nhật lại

Bài tập phỏng vấn React: sửa bộ lọc danh sách bị lệch state

by Suong Nguyen
21/10/2026
0

Luyện cách giải thích state snapshot, loại bỏ dữ liệu dẫn xuất khỏi state và chứng minh bản sửa bằng các tình huống sử dụng cụ thể.

Ảnh minh họa bài phỏng vấn Senior React Native

Tổng hợp 50 câu hỏi/trả lời phỏng vấn Senior React Native

by admin
27/07/2026
0

50 câu hỏi phỏng vấn Senior React Native bằng tiếng Việt về technical leadership, architecture, performance, release strategy, observability, security và mentoring.

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 useWindowDimensions: layout đổi chiều và vẫn đọc được chữ lớn
  • Promise.all và allSettled: chờ kết quả không có nghĩa là tự hủy tác vụ
  • Android SavedStateHandle: giữ bộ lọc khi process bị hệ thống tạo lại

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