Đồng bộ và bất đồng bộ là gì ?

04-08-23 Nguyễn Hoài Nam
-
  1. Khái niệm
    1. Đồng bộ(Synchronous
      Các dòng code được thực hiện tuần tự, công việc này xong thì mới được thực hiện các công việc khác.
      Ví dụ: 
    2. Bất đồng bộ(Asynchronous) 
      Các dòng code có thể chạy đồng thời, 2 function được gọi theo thứ tự nhưng function sau không cần đợi function trước kết thúc mà có thể chạy đồng thời với nhau.

      Ví dụ: 
  2. Tại sao nên sử dụng bất đồng bộ
    Sử dụng bất đồng bộ (asynchronous programming) có nhiều lợi ích quan trọng trong các ứng dụng và hệ thống phần mềm. Dưới đây là một số lý do chính nên sử dụng bất đồng bộ:
          a. Giảm thời gian chờ đợi: Nếu một tác vụ phải chờ đợi một tác vụ khác hoàn thành, nó sẽ phải đứng im đợi cho đến khi tác vụ đó hoàn thành. Bằng cách sử dụng bất đồng bộ, các tác vụ có thể chạy song song mà không cần chờ đợi nhau, giúp giảm thời gian chờ đợi tổng thể và tăng hiệu suất ứng dụng.
          b. Tăng hiệu suất: Bất đồng bộ cho phép các tác vụ không liên quan được thực thi đồng thời, giúp tận dụng tối đa tài nguyên hệ thống và tăng hiệu suất tổng thể của ứng dụng.
          c. Tương thích với các hệ thống có nhiều người dùng: Việc sử dụng bất đồng bộ có thể giúp tối ưu hóa việc sử dụng tài nguyên hệ thống, đảm bảo mọi người dùng đều nhận được phản hồi nhanh chóng mà không bị ảnh hưởng bởi hoạt động của người dùng khác.
          d. Xử lý các tác vụ dài hạn: Khi có các tác vụ tốn nhiều thời gian xử lý, chẳng hạn như tính toán phức tạp, bất đồng bộ cho phép thực thi các tác vụ này mà không làm chậm toàn bộ quá trình thực thi của ứng dụng.
  3. Các cách xử lý cơ bản
    Để xử lý bất đồng bộ thì mọi người thường biết tới các tên gọi sau đây: Callback, Promise, Async/Await, đúng vậy đó là những cách phổ biến nhất để xử lý bất đồng bộ tùy thuộc vào những trường hợp mà áp dụng.
    1. Dùng hàm Callback
      Callback là một function sẽ được thực thi sau khi một function khác đã được thực thi xong hoặc mọi người có thể hiểu là truyền hàm B vào hàm A dưới dụng tham số một lúc nào đó hàm A sẽ gọi hàm B để chạy.

      Tuy nhiên việc sử dụng các function lồng vào nhau nhiều sẽ dẫn đến trường hợp bị Callback Hell, chắc chắn các bạn khi mới tập xử lý bất đồng bộ ai cũng đã từng gặp phải trường hợp này. Callback Hell làm cho code khó đọc, khó hiểu và khó quản lý.
    2. Sử dụng Promise
      Promise là một cơ chế  xử lý các tác vụ bất đồng bộ và làm cho mã trở nên dễ đọc và dễ quản lý hơn. Nó giúp bạn xử lý các hoạt động không đồng bộ, chẳng hạn như yêu cầu AJAX, đọc/ghi tập tin, truy vấn cơ sở dữ liệu và tránh khỏi việc bị callbck hell.
      Promise có 3 trạng thái chính: 
      1. Pending: Trạng thái ban đầu của một Promise, nghĩa là tác vụ bất đồng bộ vẫn đang thực hiện và chưa hoàn thành.
      2. Fulfilled (Resolved): Trạng thái khi tác vụ bất đồng bộ hoàn thành thành công và Promise trả về một giá trị (kết quả).
      3. Rejected: Trạng thái khi tác vụ bất đồng bộ thất bại và Promise trả về một lỗi.

      Để tạo một Promise, bạn sử dụng cú pháp như sau:

      Sau khi tạo Promise, bạn có thể gán các xử lý khi Promise được giải quyết (fulfilled) hoặc bị từ chối (rejected) bằng cách sử dụng các phương thức then()catch():

      Nếu Promise được giải quyết thành công (fulfilled), hàm xử lý trong then() sẽ được gọi và nhận được kết quả của Promise. Nếu Promise bị từ chối (rejected), hàm xử lý trong catch() sẽ được gọi và nhận được lỗi.
    3. Dùng Async/Await 
      Async/Await là một tính năng trong JavaScript giúp xử lý các tác vụ bất đồng bộ một cách dễ đọc và dễ quản lý hơn. Nó là một cách để làm việc với Promise mà trông như là đồng bộ (synchronous) mà không cần sử dụng callback hay gọi .then().catch().
      Async được sử dụng để định nghĩa một hàm bất đồng bộ (async function). Khi một hàm được đánh dấu là async, nó tự động trả về một Promise. Khi bạn gọi một hàm bất đồng bộ, nó sẽ trả về một Promise ngay cả khi bạn không return một Promise một cách rõ ràng.
      Await được sử dụng trong hàm bất đồng bộ để đợi cho một Promise được giải quyết (fulfilled) và lấy kết quả của nó. Khi sử dụng await, mã sẽ tạm dừng cho đến khi Promise hoàn thành, sau đó nó sẽ tiếp tục thực hiện các câu lệnh tiếp theo.
      Ví dụ:

      Kết quả của ví dụ trên:

      Ở ví dụ trên, dù fetchData() trả về một Promise, ta không cần gọi .then().catch() để xử lý kết quả hoặc lỗi. Thay vào đó, ta sử dụng await để đợi cho Promise hoàn thành và lấy kết quả trả về. Việc này giúp làm cho code trông dễ đọc và giảm đi sự lồng nhau của các callback hay Promise.
  4. Kết luận
    Qua các nội dung trên chúng ta rút ra kết luận là: Lập trình bất đồng bộ có hiệu suất tốt hơn lập trình đồng bộ. Tuy nhiên, trong nhiều trường hợp chúng ta vẫn phải thực thi các đoạn mã một cách đồng bộ. Chúng ta có ba kĩ thuật là Callback, Promise, Async/Await. Callback phù hợp trong các trường hợp xử lý đơn giản hơn (như đồng bộ 2, 3 hàm bất đồng bộ) vì nó dễ hiểu. Asyn/Await phù hợp cho các trường hợp phức tạp như cần đồng bộ quá nhiều hàm bất đồng bộ.

Bài viết liên quan

Grok AI – Trợ lý AI đa năng của xAI!

25-02-2025 Admin
152 views + likes

Grok AI là một trợ lý AI tiên tiến được phát triển bởi xAI, công ty do Elon Musk sáng lập

OpenAI Chuẩn Bị Ra Mắt GPT Thế Hệ Mới Với Khả Năng Tương Tác Siêu Thực!

24-02-2025 Admin
60 views + likes

OpenAI vừa hé lộ về thế hệ GPT mới nhất, hứa hẹn sẽ mang lại khả năng tương tác tự nhiên và siêu thực hơn bao giờ hết.

Apple Vision Pro Sắp Được Mở Bán Chính Thức!

24-02-2025 Admin
68 views + likes

Thế giới công nghệ lại một lần nữa dậy sóng với tin đồn về việc Apple chuẩn bị mở bán chính thức Vision Pro

Microsoft Hé Lộ Bản Cập Nhật Lớn

24-02-2025 Admin
86 views + likes

Microsoft vừa úp mở về một bản cập nhật lớn, hứa hẹn sẽ thay đổi hoàn toàn cách chúng ta sử dụng máy tính.

Khám phá công nghệ mới

19-02-2025 Admin
65 views + likes

Công nghệ AI đang bùng nổ như thế nào trong năm 2025?