Почему мой ShardWorker не работает в Firefox, но работает в Google Chrome
Наконец-то я реализовал запуск SSE-событий, отправляемых сервером, в Shared Worker. Эта реализация позволила мне ограничить общее количество сценариев, запущенных на сервере, по одному на пользователя.
Однако у меня все еще есть пара проблем.
SharedWorker
вообще не работает в FireFox, но работает в Google Chrome. Я использую Firefox v40.0. Я не получаю никаких ошибок в консоли. Я вижу предупреждение в консоли о сертификате SSL, но ошибок нет. Вот предупреждение от консоли FireFox
Этот сайт использует Сертификат SHA-1; Рекомендуется использовать сертификаты с алгоритмами подписи, которые используют хэш-функции сильнее, чем SHA-1.[Узнать больше]
- Кажется, что
ShardWorker
перестает работать через некоторое время простоя. Это не проблема PHP-скрипта, так как скрипт работает с файлом без общего работника. Я сталкиваюсь с этой проблемой с Chrome v44.0. Для того, чтобы снова начать работу надзирателя, мне нужно перезагрузить страницу.
Что я могу сделать, чтобы выяснить, что может вызвать остановку ShardWorker? Почему нет SharedWorder
работает в FireFox?
Вот моя реализация
Это код, который называется SharedWorker
$(window).load(function(){
//establish connection to the shared worker
var worker = new SharedWorker("/add-ons/icws/js/worker.js");
//listen for a message send from the worker
worker.port.addEventListener("message",
function(event) {
console.log(event.data);
processServerData(event.data);
}
, false
);
//start the connection to the shared worker
worker.port.start();
});
Вот код для worker.js
var clients = new Array();
//runs only when a new connection starts
self.onconnect = function(event) {
var port = event.ports[0];
clients.push(port);
port.start();
//implement a channel for a communication between the connecter and the SharedWorker
port.addEventListener("message",
function(event) {
replyToClientMessage(event, port);
} , false
);
}
//reply to any message sent to the SharedWorker with the same message but add the phrase "SharedWorker Said: " to it
replyToClientMessage = function (event, port) {
port.postMessage(event.data);
}
readNewMessages();
//runs every time and post the message to all the connected client
function readNewMessages(){
var serv = new EventSource('/add-ons/icws/poll.php');
serv.addEventListener("getMessagingQueue", function(event) {
var queue = JSON.parse(event.data);
notifyAllPorts(queue);
}, false);
}
//check all open clients and post a message to each
function notifyAllPorts(msg){
var len = clients.length;
var port;
for(i = 0; i < len; i++) {
port = clients[i];
port.postMessage(msg);
}
}
1 ответ
Это невозможно. EventSource
является собственностью window
объект. window
недоступно для Worker
, См. Возможности, доступные для работников
Работники не имеют доступа к:
- DOM (это не потокобезопасно)
- Объект окна
- Объект документа
- Родительский объект