JavaScript là một ngôn ngữ lập trình bất đồng bộ (asynchronous). Điều này có nghĩa là JavaScript thường không chặn luồng chính của chương trình khi thực hiện các hoạt động I/O (như đọc và ghi dữ liệu từ tệp, gửi yêu cầu HTTP, hoặc truy vấn cơ sở dữ liệu). Thay vào đó, nó sử dụng callbacks, promises, và async/await để xử lý các tác vụ này một cách không chặn.
Ngôn ngữ JavaScript được thiết kế cho các ứng dụng web nơi mà việc tương tác với máy chủ và các tài nguyên mạng khác thường xảy ra bất đồng bộ, vì các hoạt động này có thể mất thời gian đáng kể và không nên chặn trình duyệt hoạc ứng dụng web.
Tuy nhiên, JavaScript cũng có một luồng chính (main thread) để thực thi mã JavaScript chính của bạn. Do đó, bạn cần phải cẩn thận khi làm việc với các tác vụ kháng đòi hỏi thời gian xử lý lâu dài trong luồng chính, vì điều này có thể làm cho ứng dụng của bạn trở nên không phản hồi. Để tránh tình trạng này, bạn có thể sử dụng các kỹ thuật như Web Workers để thực hiện tính toán đòi hỏi nhiều tài nguyên trong một luồng riêng biệt.
Cho các ví dụ chứng minh JavaScript là bất đồng bộ
Dưới đây là một số ví dụ để minh họa cách JavaScript hoạt động bất đồng bộ:
- setTimeout: Hàm
setTimeout
cho phép bạn lập lịch cho việc thực thi một hàm sau một khoảng thời gian cụ thể, mà không chặn luồng chính.
javascript
console.log("Bắt đầu"); setTimeout(function() { console.log("Sau 2 giây"); }, 2000); console.log("Kết thúc");
Kết quả:
css
Bắt đầu Kết thúc Sau 2 giây
- Asynchronous I/O: Đọc dữ liệu từ tệp hoặc gửi yêu cầu HTTP là các hoạt động I/O mất thời gian. JavaScript sử dụng callbacks hoặc promises để thực hiện chúng bất đồng bộ.
Ví dụ sử dụng Promise và Fetch API:
javascript
console.log("Bắt đầu"); fetch("https://jsonplaceholder.typicode.com/posts/1") .then(response => response.json()) .then(data => console.log(data)); console.log("Kết thúc");
Kết quả:
css
Bắt đầu Kết thúc { /* Dữ liệu từ máy chủ */ }
- Async/Await: Cú pháp
async/await
trong JavaScript giúp bạn viết mã bất đồng bộ một cách dễ đọc hơn. Dưới đây là ví dụ sử dụng async/await với Fetch API:
javascript
console.log("Bắt đầu"); async function fetchData() { try { const response = await fetch("https://jsonplaceholder.typicode.com/posts/1"); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } } fetchData(); console.log("Kết thúc");
Kết quả:
css
Bắt đầu Kết thúc { /* Dữ liệu từ máy chủ */ }
Trong các ví dụ này, bạn có thể thấy rằng các hoạt động không đồng bộ (như đợi trong setTimeout
hoặc truy vấn mạng) không chặn mã chính và cho phép nó tiếp tục thực thi trong khi các tác vụ không đồng bộ đang được xử lý. Điều này thể hiện tính bất đồng bộ của JavaScript.
Xin chào,
Bài viết này sử dụng AI ChatGPT để viết sau đó được lựa chọn, biên tập lại nội dung, chỉ một phần nhỏ các bài là tôi tự viết. Nội dung thể hiện ý chí cá nhân về các vấn đề, giải pháp. Tôi lưu tại website này để học, tra cứu và chia sẻ.
Tôi là Minh, sống tại Hà Nội, kỹ sư phần mềm với hơn 20 năm kinh nghiệm. Các ngôn ngữ yêu thích của tôi là Swift, Objective-C, Java, Kotlin, .NET, HTML, JavaScript, CSS, Bootstrap, jQuery, AngularJS, Angular…
Các bạn có thể tải app của tôi trên App Store hoặc Google Play:
QuestionBank-Ôn thi vào 10: phiên bản iOS, phiên bản Android
TypingTest by QuestionBank: phiên bản iOS, phiên bản Android
Xin cảm ơn,
Minh