2016-01-31 21 views
5

câu hỏi nhanhRxJS và WebWorkers

Nếu tôi có một WebWorker có một hàm trả về một Observable<Any> lại mã UI, nếu tôi sau đó đăng ký vào các quan sát được, là chạy thể quan sát được trên thread UI hoặc WebWorker chủ đề?

Tôi hỏi câu hỏi này vì tôi đang viết một ứng dụng Angular2 với RxJS, và để cải thiện hiệu suất Tôi muốn một số làm việc chăm chỉ quan sát để chạy trong WebWorkers, đi qua một dòng kết quả trên đến thread UI

+0

Bài đăng của bạn không có câu hỏi và không có mẫu mã bạn đang cố gắng thực hiện để hoạt động. – shershen

+1

@shershen Vui lòng đọc lại câu hỏi. Nó chứa tất cả các thông tin cần thiết (chỉ có điều thiếu là một dấu hỏi :) – supertopi

Trả lời

5

Tôi cho rằng nhân viên web của bạn đang gửi trở lại quan sát đến chủ đề chính của bạn qua tin nhắn.

Tin nhắn được sử dụng theo cả hai cách, bạn không thể gửi các đối tượng phơi bày chức năng.

Giải pháp là để có thông điệp bài đăng trên web của bạn và sau đó có dịch vụ chủ đề chính xử lý các thư đó và đưa chúng vào Chủ đề, nó hiển thị cho ứng dụng của bạn dưới dạng IObservable.

Hãy nhớ rằng nhắn tin của nhân viên web không hỗ trợ kênh, vì vậy, bạn cần áp dụng phân biệt đối xử của riêng mình nếu bạn sử dụng tin nhắn trên nhiều lĩnh vực trong ứng dụng của mình.

+0

Bạn có thể vui lòng cung cấp một mẫu mã với kiến ​​trúc tương tự không? Tôi muốn hiểu các điều khoản (dịch vụ luồng chính so với ứng dụng) – supertopi

+0

vì vậy bạn đang nói rằng các đối tượng duy nhất có thể di chuyển giữa nhân viên web và luồng chính là các đối tượng dữ liệu đơn giản. Có phải vì chúng cần được sắp xếp theo thứ tự? Cảm ơn –

+0

@Dean Đối với tất cả các ý định và mục đích, có, chỉ các đối tượng dữ liệu. Về cơ bản bạn sẽ có một chút mã trong chuỗi chính của bạn đăng ký 'onmessage' và gửi dữ liệu mà nó nhận được vào một' Subject' qua 'onNext()'. Phần ứng dụng cần hiển thị thông tin này sẽ đăng ký chủ đề đó để nhận cập nhật. –

2

Câu trả lời ngắn gọn là Rx không giới thiệu đồng thời trừ khi bạn hướng dẫn nó qua Đăng ký, Quan sát hoặc một số toán tử biến đổi như Bộ đệm.

Vì vậy, bất kỳ mã nào trong phần "Đăng ký" của toán tử Rx sẽ chạy trong cùng một chuỗi mà bạn đã gọi .Đăng ký (onNext v.v.). Tuy nhiên, các callback thực tế onNext, onError và onComplete sẽ chạy trên bất kỳ luồng nào mà người quan sát sử dụng, bạn không kiểm soát điều này (trừ khi bạn viết toán tử).

Để đảm bảo bạn nhận cuộc gọi trên chuỗi giao diện người dùng, bạn nên thêm .ObserveOn (UIDispatcherThread). Điều này sẽ đảm bảo các chủ đề bạn được gọi trở lại và làm cho nó có thể kiểm tra.

Hy vọng điều đó sẽ hữu ích.

0

Như những người khác đã lưu ý, thông tin liên lạc giữa mã gọi điện và công việc web được đăng theo thứ tự và do đó bạn không thể gửi thứ gì đó có hành vi (như vậy có thể quan sát được) qua dây.

Tôi đã viết một chút trợ giúp sử dụng Rxjs để giúp giải quyết vấn đề này và những nỗi đau khác trong việc phát triển với các webworker. Đọc về nó here, github repo here