Đồ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

Cải thiện công việc thông qua công cụ hỗ trợ ghi nhớ

23-09-2024 Admin
76 views + likes

Trong quá trình làm việc hàng ngày, nhiều nhân sự gặp phải khó khăn trong việc nhớ và quản lý các công việc, dễ dẫn đến bỏ sót nhiệm vụ quan trọng

8 Công cụ Marketing Online hỗ trợ bán hàng hiệu quả nhất 2024

19-08-2024 Hồ Thị Mỹ Anh
64 views + likes

Bán hàng hiệu quả, tăng doanh số là mục tiêu của bất cứ cửa hàng kinh doanh nào bởi đây là một trong những yếu tố tiên quyết giúp giảm thời gian quay vòng vốn. Vậy có những công cụ nào hỗ trợ bán hàng hiệu quả?

Overloading và Overriding có gì khác nhau?

12-07-2024 Admin
83 views + likes

Overloading và Overriding là hai khái niệm quan trọng trong lập trình hướng đối tượng, và chúng có những sự khác biệt cơ bản:

Hướng dẫn sử dụng phần mềm quản lý gym BIGAPPTECH

16-01-2024 Nguyễn Hoài Nam
149 views + likes

Hướng dẫn sử dụng phần mềm quản lý gym BIGAPPTECH

Tầm Quan Trọng Của Website Đối Với Doanh Nghiệp Mới Thành Lập

31-01-2024 Nguyễn Hoài Nam
85 views + likes

Tầm Quan Trọng Của Website Đối Với Doanh Nghiệp Mới Thành Lập