Tôi đang suy nghĩ về nó và đây là những gì tôi nghĩ ra:
Hãy nói rằng chúng ta có một mã như thế này:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Một yêu cầu xuất hiện và công cụ JS bắt đầu thực thi mã ở trên từng bước. Hai cuộc gọi đầu tiên là cuộc gọi đồng bộ. Nhưng khi nói đến setTimeout
phương thức, nó trở thành một thực thi không đồng bộ. Nhưng ngay lập tức JS trả về từ nó và tiếp tục thực thi, được gọi là Non-Blocking
hoặc Async
. Và nó tiếp tục làm việc khác, vv
Kết quả của việc thực hiện này là như sau:
acdb
Vì vậy, về cơ bản, cái thứ hai setTimeout
đã hoàn thành đầu tiên và chức năng gọi lại của nó được thực hiện sớm hơn cái đầu tiên và điều đó có ý nghĩa.
Chúng ta đang nói về ứng dụng đơn luồng ở đây. Công cụ JS tiếp tục thực hiện điều này và trừ khi nó hoàn thành yêu cầu đầu tiên, nó sẽ không chuyển sang yêu cầu thứ hai. Nhưng điều tốt là nó sẽ không chờ các hoạt động chặn như setTimeout
giải quyết để nó sẽ nhanh hơn vì nó chấp nhận các yêu cầu mới đến.
Nhưng câu hỏi của tôi phát sinh xung quanh các mục sau đây:
# 1: Nếu chúng ta đang nói về một ứng dụng đơn luồng, thì cơ chế nào xử lý setTimeouts
trong khi công cụ JS chấp nhận nhiều yêu cầu hơn và thực thi chúng? Làm thế nào để chủ đề duy nhất tiếp tục làm việc trên các yêu cầu khác? Những gì hoạt động setTimeout
trong khi các yêu cầu khác tiếp tục đến và được thực hiện.
# 2: Nếu các setTimeout
chức năng này được thực thi phía sau hậu trường trong khi có nhiều yêu cầu đến và được thực thi, điều gì sẽ thực hiện các thực thi không đồng bộ phía sau hậu trường? Cái mà chúng ta nói đến được gọi là EventLoop
gì?
# 3: Nhưng không nên đặt toàn bộ phương thức EventLoop
để toàn bộ điều được thực thi và phương thức gọi lại được gọi? Đây là những gì tôi hiểu khi nói về chức năng gọi lại:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Nhưng trong trường hợp này, làm thế nào để Công cụ JS biết nếu đó là một hàm async để nó có thể đặt cuộc gọi lại trong EventLoop? Perhaps something like the
từ khóa async` trong C # hoặc một loại thuộc tính nào đó cho biết phương thức mà JS Engine sẽ sử dụng là phương thức async và nên được điều trị phù hợp.
# 4: Nhưng một bài báo nói hoàn toàn trái ngược với những gì tôi đã đoán về cách mọi thứ có thể hoạt động:
Vòng lặp sự kiện là một hàng đợi các hàm gọi lại. Khi một chức năng async thực thi, chức năng gọi lại được đẩy vào hàng đợi. Công cụ JavaScript không bắt đầu xử lý vòng lặp sự kiện cho đến khi mã sau khi hàm async được thực thi.
# 5: Và có hình ảnh này ở đây có thể hữu ích nhưng lời giải thích đầu tiên trong hình ảnh là nói chính xác điều tương tự được đề cập trong câu hỏi số 4:
Vì vậy, câu hỏi của tôi ở đây là để có được một số làm rõ về các mục được liệt kê ở trên?