- From: Simon Pieters <simonp@opera.com>
- Date: Tue, 23 Feb 2010 21:36:15 +0100
The Web Worker's first example of shared workers is quite involved and not so easy to follow if you haven't dealt with shared workers before. For someone wanting to experiment with shared workers, it's easier to grasp how things work by doing something very basic first. It would be useful if the spec had an example for this. The example should include: * How to create a shared worker. * How to listen for messages from the worker. Note explicitly that the listener is on the port -- not the worker object. * If addEventListener('message',...) is used, note that start() needs to be called. * In the shared worker, show how to listen for connect events, how to listen for messages on the port, how to post messages back. Note explicitly that postMessage needs to be called on the 'connect' event's ports[0]; not the 'message' event's ports[0]. * When all that is working, throw in another browsing context that connects to the same worker. Something like this: step 1. test.html <pre id="log">Log:</pre> <script> var worker = new SharedWorker('test.js'); var log = document.getElementById('log'); worker.port.onmessage = function(e) { // note: not worker.onmessage! log.textContent += '\n' + e.data; } </script> test.js onconnect = function(e) { var port = e.ports[0]; port.postMessage('hello'); } step 2. test.html <pre id="log">Log:</pre> <script> var worker = new SharedWorker('test.js'); var log = document.getElementById('log'); worker.port.addEventListener('message', function(e) { log.textContent += '\n' + e.data; }, false); worker.port.start(); // note: need this when using addEventListener worker.port.postMessage('ping'); </script> test.js onconnect = function(e) { var port = e.ports[0]; port.postMessage('hello'); port.onmessage = function(e) { port.postMessage('pong'); // not e.ports[0].postMessage! } } step 3. test.html <pre id="log">Log:</pre> <script> var worker = new SharedWorker('test.js'); var log = document.getElementById('log'); worker.port.addEventListener('message', function(e) { log.textContent += '\n' + e.data; }, false); worker.port.start(); worker.port.postMessage('ping'); </script> <iframe src=other.html></iframe> other.html <pre id=log>Inner log:</pre> <script> var worker = new SharedWorker('test.js'); var log = document.getElementById('log'); worker.port.onmessage = function(e) { log.textContent += '\n' + e.data; } </script> test.js onconnect = function(e) { var port = e.ports[0]; port.postMessage('hello'); port.onmessage = function(e) { port.postMessage('pong'); } } -- Simon Pieters Opera Software
Received on Tuesday, 23 February 2010 12:36:15 UTC