2011-09-27 23 views
123

Vì JavaScript chạy trong một chuỗi duy nhất, sau khi yêu cầu AJAX được thực hiện, điều gì thực sự xảy ra trong nền? Tôi muốn có được một cái nhìn sâu sắc hơn về điều này, bất cứ ai có thể làm sáng tỏ một số?JavaScript xử lý phản hồi AJAX trong nền như thế nào?

+5

Một mô tả khá hay ở đây: http://stackoverflow.com/questions/2914161/ajax-multi-threaded –

+3

Mã JavaScript là một luồng đơn (trừ công nhân web), nhưng không phải là trình duyệt đang chạy công cụ JavaScript ... –

+0

@JuanMendes JavaScript có chạy trong một chuỗi trong khi Hàng đợi sự kiện chạy trong một chuỗi khác không? –

Trả lời

190

Bên dưới trang bìa, javascript có hàng đợi sự kiện. Mỗi khi một chuỗi javascript thực thi kết thúc, nó sẽ kiểm tra xem có sự kiện nào khác trong hàng đợi xử lý hay không. Nếu có, nó kéo nó ra khỏi hàng đợi và kích hoạt sự kiện đó (ví dụ như một cú click chuột).

Mạng mã gốc nằm dưới cuộc gọi ajax sẽ biết khi nào phản hồi ajax được thực hiện và sự kiện sẽ được thêm vào hàng đợi sự kiện javascript. Làm thế nào mã nguồn gốc biết khi nào cuộc gọi ajax được thực hiện phụ thuộc vào việc thực hiện. Nó có thể được thực hiện với chủ đề hoặc nó cũng có thể là sự kiện điều khiển chính nó (nó không thực sự quan trọng). Điểm thực hiện là khi đáp ứng ajax được thực hiện, một số mã gốc sẽ biết nó được thực hiện và đặt một sự kiện vào hàng đợi JS.

Nếu không có Javascript nào đang chạy vào thời điểm đó, sự kiện sẽ được kích hoạt ngay lập tức sẽ chạy trình xử lý phản hồi ajax. Nếu một cái gì đó đang chạy vào thời điểm đó, thì sự kiện sẽ được xử lý khi chuỗi javascript hiện tại của quá trình thực hiện kết thúc. Không cần phải có bất kỳ cuộc thăm dò nào của công cụ javascript. Khi một đoạn Javascript kết thúc thực thi, công cụ JS chỉ kiểm tra hàng đợi sự kiện để xem có bất kỳ thứ gì khác cần chạy hay không. Nếu vậy, nó sẽ xuất hiện sự kiện tiếp theo ngoài hàng đợi và thực thi nó (gọi một hoặc nhiều hàm gọi lại được đăng ký cho sự kiện đó). Nếu không có gì trong hàng đợi sự kiện, thì trình thông dịch JS có thời gian rảnh (thu thập rác hoặc nhàn rỗi) cho đến khi một số tác nhân bên ngoài đặt thứ gì đó khác vào hàng đợi sự kiện và đánh thức nó lên lần nữa.

Vì tất cả các sự kiện bên ngoài đều đi qua hàng đợi sự kiện và không có sự kiện nào được kích hoạt trong khi javascript thực sự chạy một thứ khác, nó vẫn duy trì luồng đơn.

Dưới đây là một số bài viết về các chi tiết:

+6

Câu trả lời hay. Tài liệu tham khảo sẽ làm cho nó trở thành một câu trả lời tuyệt vời :) – Jeff

+8

Đã thêm tham chiếu. – jfriend00

+0

Cảm ơn vì điều đó. Tôi nghi ngờ đây là trường hợp, nhưng tốt để biết chắc chắn. Tôi có vòng lặp for, trong đó tôi gửi rất nhiều yêu cầu 'ajax'. Trong trình xử lý của tôi (đối với mỗi yêu cầu - được trả về theo thứ tự tùy ý), tôi chạy một số mã có thể mất chút thời gian. Tốt để biết điều này chắc chắn nên làm việc. – iPadDeveloper2011

15

Bạn có thể tìm here một tài liệu hướng dẫn rất đầy đủ về sự kiện xử lý trong javascript.
Nó được viết bởi một anh chàng làm việc trên thực hiện javascript trong trình duyệt Opera.

Chính xác hơn, nhìn vào tiêu đề: "Sự kiện dòng chảy", "tổ chức sự kiện Queuing" và "Non-user Sự kiện": bạn sẽ học được rằng:

  1. Javascript chạy trong một chủ đề duy nhất cho mỗi trình duyệt tab hoặc cửa sổ.
  2. Sự kiện được xếp hàng đợi và được thực hiện tuần tự.
  3. XMLHttpRequest được chạy bởi việc triển khai và các cuộc gọi lại được chạy bằng hàng đợi sự kiện.

Lưu ý: Liên kết gốc là: link, nhưng hiện đã chết.

+0

giải thích rất tốt trong tóm tắt .. – refactor

Các vấn đề liên quan