2012-05-14 51 views
15

Có cách nào để đồng bộ chờ hoặc kiểm tra tin nhắn mới trong một nhân viên web không?Đồng bộ Đợi tin nhắn trong Web-Worker

Tôi có một cơ thể mã phức tạp (biên dịch LLVM từ emscripten) mà tôi không thể cấu trúc lại xung quanh các cuộc gọi lại.

Tôi cần đảm bảo rằng mã sau một dòng nhất định không thực thi cho đến khi tôi nhận và xử lý thư từ chuỗi giao diện người dùng. Nếu tôi chặn với vòng lặp while, vòng lặp sự kiện sẽ không bao giờ chạy nên tôi không thể nhận tin nhắn.

+0

Sẽ có một giải pháp cho vấn đề của bạn nếu ECMAScript là một ngôn ngữ phong phú như Scheme với 'call-with-continuation'. Điều này sẽ cho phép bạn nắm bắt được sự tiếp tục hiện tại và gọi nó một lần nữa trong trình xử lý 'onmessage' của bạn. – Marc

Trả lời

0

Không, thật không may. Đã có một số cuộc thảo luận về việc thêm một cách để chặn tin nhắn từ trang gốc, nhưng nó không đi đến đâu cả. Tôi sẽ xem liệu tôi có thể đào lên chuỗi danh sách gửi thư có liên quan hay không.

1

Bạn có thể ngắt chuỗi như sau mà không cần tái cấu trúc không?

wrk.onmessage = function(e) { 
    if (e.data.step === 'initial input') { 
     doInitialWork(e.data.inputs) 
    } else if (e.data.step === 'ui input') { 
     doTheRest(e.data.uiData) 
    } 
} 

Sự kiện onmessage sẽ bị chặn cho đến khi ngăn xếp thực thi bước đầu hoàn thành và các bit quan trọng sẽ chỉ khởi chạy khi có thông tin.

0

Tấn công thô để thực hiện việc này có thể là sử dụng API đồng bộ, chẳng hạn như API hệ thống tệp và sử dụng tệp tạm thời làm cơ chế đồng bộ hóa.

Trong ví dụ của bạn, mã emscripten có thể phát hành đọc đồng bộ trên một tệp, trong khi chuỗi giao diện người dùng ghi vào cùng một tệp, bỏ chặn công việc một cách hiệu quả.

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