jsrosetta

Bất đồng bộ

Async/Await

Promise và async/await của Node.js so với goroutine (Go), Future + tokio (Rust), Swift concurrency và CompletableFuture (Java).

Node.js chạy một event loop đơn luồng: await nhường quyền cho event loop cho tới khi Promise hoàn tất. Mỗi ngôn ngữ dưới đây giải quyết cùng bài toán theo mô hình riêng. Đọc kỹ phần ghi chú vì khác biệt nằm ở runtime, không chỉ ở cú pháp.

Chờ một tác vụ

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
 
async function fetchUser(id) {
  await sleep(100);
  return { id, name: `user-${id}` };
}
 
const user = await fetchUser(1); // top-level await trong ES module
console.log(user.name);

Chạy song song (Promise.all)

const users = await Promise.all([1, 2, 3].map(fetchUser));
console.log(users.length); // 3, tổng thời gian ~100ms

Khác biệt cần nhớ

Node.js Go Rust Swift Java
Đơn vị bất đồng bộ Promise goroutine Future Task CompletableFuture
Bắt đầu chạy khi tạo Promise gọi go bị .await/poll gọi async let/Task gọi supplyAsync
Runtime event loop có sẵn có sẵn tự chọn (tokio…) có sẵn thread pool có sẵn
Đa luồng thật không (trừ worker) có có có có

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#asyncawait