2014-09-29 5 views
1

Я узнаю о веб-работнике. Я использую учебник последующегоТипError: Недостаточно аргументов для Window.postMessage

https://developer.mozilla.org/en/docs/Web/Guide/Performance/Using_web_workers

До сих пор он работает. У меня есть следующий код

var worker = new Worker('thing.js'); 

worker.addEventListener('message', function(e) { 
    alert("Worker said: " + e.data); 
}, false); 

worker.postMessage("Test me"); 

и в моем thing.js файл

self.addEventListener('message', function(e) { 
    self.postMessage(e.data); 
}, false); 

выше работает отлично.

Однако мне нужно передать сообщение из моей вещи.js обратно в мой основной файл js, чтобы продемонстрировать его передачу обновления.

Опять же, учебник показывает, что я могу это сделать, так что у меня есть следующий обновленного код

var worker = new Worker('thing.js'); 

worker.addEventListener('message', function(e) { 
    alert("Worker said: " + e.data); 
}, false); 

worker.postMessage("Test me"); 

и в моем thing.js

self.addEventListener('message', function(e) { 
    self.postMessage(e.data); 
}, false); 

function DoThisThing() { 
    postMessage("I should ALSO be working but I am not."); 
} 

Это терпит неудачу с сообщением об ошибке (в FireBug):

TypeError: Not enough arguments to Window.postMessage.

Я не вижу, что я сделал неправильно.

+0

Вы прокомментировали сообщение в окне, которое вызывает сообщение рабочего, которое, похоже, просто отражает исходное сообщение. – kennebec

+0

попробуйте добавить целевое происхождение: https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage – akonsu

+0

@kennebec, извинения, это была ошибка в моем посте, теперь исправлено – MyDaftQuestions

ответ

1

Было бы удобно иметь полный исходный код, который вызвал проблему, но я уверен, проблема заключалась в том, что помимо создания экземпляра рабочего кода ваш код также включал рабочий файл с помощью тега скрипта. Что-то вроде:

<script type="text/javascript" src="thing.js"></script> 

Так в основном то, что у вас есть:

thing.js (рабочий)

self.addEventListener('message', function(e) { 
     self.postMessage(e.data); 
    }, false); 

    function DoThisThing() { 
     postMessage("I should ALSO be working but I am not."); 
    } 

    DoThisThing(); 

Я предполагаю, что вы называли DoThisThing(), так как в противном случае вы не будете получите ошибку "TypeError: Not enough arguments to Window.postMessage".

Если вы запустите код, поскольку он работает, но вы также видите ошибку.

TypeError: Not enough arguments to Window.postMessage. 
Worker said: I should ALSO be working but I am not. 
Worker said: Test me 

Так что же вызывало TypeError: недостаточно аргументов ...? Если вы пытались найти файл из тега script, функция будет выполняться два раза на самом деле. При первом вызове возникает ошибка.

Когда thing.js получает источник по тегу сценария, DoThisThing() получает исполнение. Это первый звонок. DoThisThing() звонки postmessage (такие же, как self.postmessage). Но этот вызов разрешается до window.postmessage. Этот метод требует второго аргумента (targetOrigin).

Однако, когда работник получает исполнение, вызов postmessage (то же, что и self.postmessage) разрешается до DedicatedWorkerGlobalScope.postmessage. Этот метод не требует второго аргумента.

Когда вы добавили второй аргумент postmessage, вы решили проблему для первого вызова, но не второго. Таким образом, вы получили новую ошибку: «TypeError: Аргумент 2 из DedicatedWorkerGlobalScope.postMessage не может быть преобразован в последовательность».

Подводя итоги, существует два типа сообщений, одно из которых относится к объекту окна, и другое, относящееся к объекту DedicatedWorkerGlobalScope. Простой вызов postmessage обычно разрешается объектом DedicatedWorkerGlobalScope. Этот вызов удобен для общения с родителями. window.postmessage требует второго параметра, указывающего targetOrigin. Этот вызов удобен для перекрестных сообщений.

В вашем случае вероятной причиной проблемы был поиск рабочего файла JavaScript для работы с тегом script. Это вызвало postmessage, чтобы получить разрешение по окну, что потребовало второго аргумента.

Смежные вопросы