tôi không có sự thật khó khăn, nhưng kể từ khi bạn hỏi ý kiến ... :)
Có một vấn đề kể trong Chrome: Quá nhiều Web Workers có thể gây ra một vụ tai nạn im lặng (mũ ~ 60-100 , theo số this bug report). Vấn đề chung là Web Worker là nguồn tài nguyên chuyên sâu, ít nhất là với v8.
Giả sử bạn đang đi để kết thúc làm cho nhiều cuộc gọi HTTP, nếu bạn đang làm cuộc gọi HTTP đồng bộ trong một Worker Web:
- Trong một nghĩa nào đó, bạn đang kinh doanh các cuộc gọi HTTP không đồng bộ cho Web không đồng bộ Công nhân, mà sẽ chỉ được thêm một trung gian khác vào hỗn hợp và bạn vẫn phải quản lý mọi thứ một cách không đồng bộ.
- Nếu bạn đi theo con đường đơn giản và hiệu quả hơn và chỉ sử dụng một Web Worker, bạn sẽ dành rất nhiều thời gian chờ đợi nó cung cấp cho bạn câu trả lời.
- Nếu, mặt khác, bạn sử dụng nhiều Web Workers, bạn có thể cần phải theo dõi cái nào là miễn phí, cái nào đang bận, vv .. trong trường hợp này bạn sẽ tạo một bộ lập lịch biểu được trồng tại nhà thay vì sử dụng những gì được đưa vào trình duyệt.
- Cuối cùng, các Web Worker đắt tiền (rõ ràng), và bạn có thể sẽ tạo ra nhiều Web Worker chỉ để họ có thể ngồi xung quanh và đợi cuộc gọi HTTP kết thúc.
Tôi không coi bản thân mình là chuyên gia về vấn đề này, vì vậy hãy thực hiện việc này vì những gì đáng giá.
Cập nhật: Thêm một số ưu điểm/khuyết điểm cho các trường hợp khác nhau.
Một số ưu/khuyết điểm mà tôi suy nghĩ khi lựa chọn giữa thực hiện cuộc gọi HTTP đồng bộ và không đồng bộ khi sử dụng một Worker Web:
- Nói chung, yêu cầu đồng bộ sẽ dễ dàng hơn để viết và sẽ cho kết quả trong mã đó là dễ dàng để làm theo. Một nhược điểm của các yêu cầu đồng bộ là chúng có thể khuyến khích viết các hàm dài cần được khắc ra thành các hàm riêng biệt, nhỏ hơn.
- Nếu bạn đang thực hiện một cuộc gọi, không có sự khác biệt về thời gian cần để hoàn thành giữa hai phương pháp và đồng bộ là tốt hơn vì nó đơn giản hơn một chút. Tôi nói nó chỉ đơn giản hơn một chút bởi vì một cuộc gọi asynch đơn với một người nghe gọi lại thực sự khá đơn giản.
- Nếu bạn đang thực hiện nhiều cuộc gọi phải xảy ra trong một chuỗi cụ thể, như tải dữ liệu hồ sơ của người dùng và sau đó nhận thời tiết địa phương dựa trên địa chỉ của họ, cuộc gọi đồng bộ sẽ tốt hơn vì nó sẽ dễ dàng hơn để viết và dễ đọc hơn nhiều.Điều chính về đọc nó là các phụ thuộc tuần tự trong các cuộc gọi sẽ được vạch ra rõ ràng bởi sự lựa chọn thực hiện các cuộc gọi đồng bộ và thứ tự của chúng trong hàm. Càng có nhiều cuộc gọi, điều này càng quan trọng. Nếu có nhiều cuộc gọi, sự khác biệt về độ phức tạp có thể là quyết liệt.
- Nếu bạn phải thực hiện nhiều cuộc gọi không cần phải xảy ra theo bất kỳ thứ tự cụ thể nào thì yêu cầu không đồng bộ sẽ tốt hơn vì quá trình tổng thể có thể là đơn đặt hàng có cường độ nhanh hơn so với yêu cầu đồng bộ. Càng nhiều cuộc gọi bạn đang thực hiện hoặc kết nối chậm hơn thì sự khác biệt đáng kể trong tổng thời gian trôi qua sẽ là; sự khác biệt này sẽ phát triển rất nhanh (theo cấp số nhân?). Theo quan điểm của ai đó đọc mã, tôi nghĩ sử dụng các yêu cầu đồng bộ, trong trường hợp này, sẽ là hơi gây hiểu nhầm vì nó cho thấy có tính chất tuần tự đối với các cuộc gọi mặc dù không có. Từ quan điểm của việc viết một loạt các yêu cầu asynch mà không phụ thuộc vào nhau, nó không nên quá xấu bởi vì bạn chỉ cần thiết lập một truy cập, thực hiện tất cả các cuộc gọi, tăng truy cập trong mỗi callbacks và bạn đã hoàn thành khi bộ đếm bằng số lượng cuộc gọi bạn đã thực hiện.
Có thể ... và tùy thuộc vào yêu cầu của bạn, mặc dù AJAX không phải là AJAX mà không có sự không đồng bộ !!! – geekman
Tôi không thể khuyên bạn nên sử dụng SJAX (javascript và XML đồng bộ) nhưng tôi cũng muốn xem một số sự kiện khó khăn và mối quan tâm của tôi không phản ánh hành vi trong môi trường nhiều luồng. –
Cảm ơn các bạn. Tôi biết ý nghĩa của A trong AJAX :) nhưng tôi đã thấy nhiều người làm một cái gì đó như thế này khi họ đang sử dụng công nhân web. – Gecko