2014-09-09 11 views
5

Chrome là bộ ba cuối cùng của bộ ba lớn (IE, Firefox, Chrome) ngừng sử dụng các cuộc gọi XMLHttpRequest đồng bộ trên "chủ đề chính" (như Firefox gọi nó). Một số trình duyệt cũng đã xóa hoàn toàn khả năng thiết lập tùy chọn .widthCredentials cho các yêu cầu đồng bộ trên chuỗi chính.Mã nào sẽ chạy trên chuỗi chính của trình duyệt?

Sau khi tìm kiếm xa và rộng, tôi không thể tìm đủ thông tin để xác định chính xác mã nào sẽ chạy trên chuỗi chính và chuỗi nào sẽ không chạy.

Rõ ràng là javascript được bao gồm qua thẻ tập lệnh (nội tuyến hoặc với src) là trên chuỗi chính. Và XHR đồng bộ chạy bên trong cuộc gọi lại của XHR không đồng bộ sẽ không chạy trên luồng chính.

Nhưng về các trường hợp khác thì sao? Sự kiện chuột, sự kiện chạm, sự kiện tài liệu khác nhau? Làm thế nào để nói mà không cần cố gắng tất cả mọi thứ? Nó sẽ là tốt đẹp để tránh làm cho tất cả mọi thứ không đồng bộ và một địa ngục gọi lại.

Vui lòng thử câu trả lời kỹ lưỡng.

Edit: W3C spec warning: phát triển phải không vượt qua sai lầm cho đối số async khi môi trường toàn cầu JavaScript là một môi trường tài liệu vì nó có tác động bất lợi đến kinh nghiệm của người dùng cuối. Tác nhân người dùng được khuyến khích mạnh mẽ để cảnh báo về việc sử dụng như vậy trong các công cụ nhà phát triển và có thể thử nghiệm với việc ném một ngoại lệ "InvalidAccessError" khi nó xảy ra để tính năng cuối cùng có thể bị xóa khỏi nền tảng.

Chỉnh sửa 2: Làm rõ:

Có những tình huống mà gọi mã phải hoặc là chờ đợi cho tất cả các async đồng thời đua đòi để kết thúc (sử dụng một số quầy hoặc theo dõi trạng thái variabiles cho mỗi cuộc gọi), hoặc đã cho họ xích sử dụng gọi lại. Mỗi tình huống rất tệ. Ví dụ: tôi có ứng dụng JSONRPC cần cần để tự động tạo các hàm có thể gọi bằng cách thẩm vấn API phản chiếu. Đây là trên bàn tay để có tất cả mã thực hiện (UI, hoặc NOT) chạy bên trong cuộc gọi lại của một thư viện khác, đặc biệt nếu nó phải được thực hiện trên nhiều trang, và nếu thư viện phải hoạt động như một định nghĩa đơn giản (ẩn đang chạy mã tại thời điểm xác định). Đây chỉ là một ví dụ về sự phức tạp, tôi không yêu cầu giải pháp cho nó, mà là một giải thích rõ ràng về cách các trình duyệt quyết định đó là chủ đề chính.

+1

Bạn nghĩ gì là "chuỗi chính"? Tại sao một XHR đồng bộ (từ một cuộc gọi lại không đồng bộ) rõ ràng không chạy trên luồng chính? – Bergi

+0

@Bergi Đó chính là câu hỏi của tôi, tóm tắt. Trình duyệt xem xét "chủ đề chính" khi chạy javascript trên trang là gì? (Firefox đang gọi nó là "chủ đề chính"). Đây là một tham chiếu: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests –

+1

Chỉ có một chuỗi * javascript * duy nhất (cho mỗi môi trường, tức là trang). Các chủ đề khác mà trình duyệt sử dụng để tính toán trong một trang và các trình duyệt nào trong số đó được coi là "chính", phụ thuộc vào việc triển khai thực hiện và phải hoàn toàn không liên quan. – Bergi

Trả lời

2

Như các bạn đã trích dẫn W3C spec, thật dễ dàng để giải thích những gì bạn đang săn sau:

phát triển không được vượt qua sai lầm cho đối số async khi Javascript môi trường toàn cầu là một môi trường tài liệu vì nó có ảnh hưởng bất lợi đến trải nghiệm của người dùng cuối.

Những gì họ có nghĩa document environment được giải thích trong processing models:

đặc điểm kỹ thuật này mô tả ba loại hoạt Javascript toàn cầu môi trường: môi trường tài liệu, chuyên dụng lao động môi trường và môi trường lao động chia sẻ. Công nhân chuyên dụng môi trường và môi trường làm việc chung là cả hai loại công nhân môi trường.

Trừ khi được chỉ định khác, môi trường toàn cầu JavaScript là môi trường tài liệu .

Vì vậy, "môi trường tài liệu" là môi trường JavaScript chung của một trang, tức là window mà bạn thấy. Mỗi môi trường toàn cầu JS là single-threaded. Tất cả mọi thứ (thực sự tất cả mọi thứ, bạn xem xét: sự kiện chuột, sự kiện cảm ứng, sự kiện tài liệu khác nhau) chạy trong môi trường này. Đây có lẽ là những gì Gecko coi là "chủ đề chính".

Nó sẽ được tốt đẹp để tránh làm cho mọi thứ không đồng bộ và một địa ngục callback

Làm một cái gì đó không đồng bộ không chuyển công việc từ các chủ đề chính. Nó chỉ ngăn chặn nó, làm cho nó có thể cho các sự kiện khác để chạy trong khi bạn đang chờ đợi. Nếu có api không đồng bộ cho những gì bạn muốn làm (tức là xử lý trong nền), hãy sử dụng nó. Làm mọi thứ không đồng bộ.

Có đủ kỹ thuật (ví dụ: lời hứa!) Để tránh địa ngục gọi lại, đó chỉ là dấu hiệu của mã không hợp lệ.

Việc dịch chuyển khỏi "chuỗi chính" yêu cầu bạn phải tạo môi trường mới - một nhân viên web. Trong đó, bạn có thể thực hiện càng nhiều XMLHttpRequests đồng bộ như bạn muốn mà không bị quấy rầy.

1

Mỗi trình duyệt được tự do triển khai mô hình luồng riêng của mình khi nó phù hợp. Các triển khai khác nhau sẽ xử lý luồng khác nhau.

Có thể nói rằng nếu bạn muốn chặn thực thi bằng JavaScript mà bạn đang làm điều gì đó bạn không nên làm. Ngay cả khi bạn không treo giao diện người dùng, trình duyệt những ngày này sẽ nhắc người dùng hủy bỏ tập lệnh của bạn. Nếu bạn ở trong phạm vi xử lý chặn hợp lý trong tập lệnh của mình, đây không phải là vấn đề. XHR đồng bộ là một cái gì đó bạn không bao giờ nên làm, vì nó là không cần thiết và thời gian mà các chủ đề sẽ chặn là không thể đoán trước.

+0

@ Tiberiu-IonuțStan Trước hết, nó không phải là một vấn đề. Toàn bộ thế giới phát triển web hoạt động trong các ràng buộc này. Thứ hai, các thông số kỹ thuật nói rất ít về việc thực hiện, như họ cần. Các thông số kỹ thuật phác thảo đầu vào và đầu ra với ít hơn.Câu trả lời là ** sẽ có sự khác biệt **, và rằng nếu bạn ở trong một số hướng dẫn thông thường (được nêu trong câu trả lời của tôi) thì bạn sẽ không gặp bất kỳ rắc rối nào. Nếu bạn đang mong đợi một điều gì đó khác biệt, bạn được tự do tham gia W3C, tham gia vào một ủy ban và tranh luận về trường hợp của bạn. – Brad

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