Đầu tiên, tôi nhận ra mình đến trễ khi trả lời câu hỏi này.
Trước khi thảo luận về đồng bộ và không đồng bộ, chúng ta hãy xem xét ngắn gọn về cách các chương trình chạy.
Trong trường hợp đồng bộ , mỗi câu lệnh hoàn thành trước khi câu lệnh tiếp theo được chạy. Trong trường hợp này, chương trình được đánh giá chính xác theo thứ tự của các báo cáo.
Đây là cách không đồng bộ hoạt động trong JavaScript. Có hai phần trong công cụ JavaScript, một phần xem mã và xử lý các hoạt động và phần khác xử lý hàng đợi. Việc xử lý hàng đợi xảy ra trong một luồng, đó là lý do tại sao chỉ có một thao tác có thể xảy ra tại một thời điểm.
Khi một hoạt động không đồng bộ (như truy vấn cơ sở dữ liệu thứ hai) được nhìn thấy, mã được phân tích cú pháp và thao tác được đưa vào hàng đợi, nhưng trong trường hợp này, một cuộc gọi lại được đăng ký để chạy khi hoạt động này hoàn thành. Hàng đợi có thể có nhiều hoạt động trong đó. Các hoạt động ở phía trước của hàng đợi được xử lý và loại bỏ khỏi hàng đợi. Khi thao tác truy vấn cơ sở dữ liệu được xử lý, yêu cầu được gửi đến cơ sở dữ liệu và khi hoàn thành việc gọi lại sẽ được thực hiện khi hoàn thành. Tại thời điểm này, bộ xử lý hàng đợi đã "xử lý" thao tác di chuyển sang thao tác tiếp theo - trong trường hợp này
console.log("Hello World");
Truy vấn cơ sở dữ liệu vẫn đang được xử lý, nhưng thao tác console.log nằm ở phía trước hàng đợi và được xử lý. Đây là một hoạt động đồng bộ được thực hiện ngay lập tức dẫn đến kết quả đầu ra "Hello World". Một thời gian sau, hoạt động cơ sở dữ liệu hoàn tất, chỉ sau đó cuộc gọi lại được đăng ký với truy vấn được gọi và xử lý, đặt giá trị của kết quả biến thành các hàng.
Có thể một hoạt động không đồng bộ sẽ dẫn đến một hoạt động không đồng bộ khác, hoạt động thứ hai này sẽ được đưa vào hàng đợi và khi đến trước hàng đợi, nó sẽ được xử lý. Gọi lại cuộc gọi được đăng ký với một hoạt động không đồng bộ là cách thời gian chạy JavaScript trả về kết quả của hoạt động khi nó được thực hiện.
Một phương pháp đơn giản để biết thao tác JavaScript nào không đồng bộ là cần lưu ý nếu nó yêu cầu gọi lại - cuộc gọi lại là mã sẽ được thực thi khi hoạt động đầu tiên hoàn tất. Trong hai ví dụ trong câu hỏi, chúng ta chỉ có thể thấy trường hợp thứ hai có cuộc gọi lại, vì vậy đó là hoạt động không đồng bộ của hai trường hợp. Không phải lúc nào cũng như vậy vì các cách xử lý khác nhau đối với kết quả của một hoạt động không đồng bộ.
Để tìm hiểu thêm, đọc về lời hứa. Hứa hẹn là một cách khác trong đó kết quả của một hoạt động không đồng bộ có thể được xử lý. Điều hay ho về những lời hứa là phong cách mã hóa cho cảm giác giống như mã đồng bộ hơn.
Nhiều thư viện như nút 'fs', cung cấp cả kiểu đồng bộ và kiểu không đồng bộ cho một số thao tác. Trong trường hợp thao tác không mất nhiều thời gian và không được sử dụng nhiều - như trong trường hợp đọc tệp cấu hình - thao tác kiểu đồng bộ sẽ dẫn đến mã dễ đọc hơn.