Я пытаюсь понять this example:Работники Web - Как они работают?
HTML (основной код):
<html>
<title>Test threads fibonacci</title>
<body>
<div id="result"></div>
<script language="javascript">
var worker = new Worker("fibonacci.js");
worker.onmessage = function(event) {
document.getElementById("result").textContent = event.data;
dump("Got: " + event.data + "\n");
};
worker.onerror = function(error) {
dump("Worker error: " + error.message + "\n");
throw error;
};
worker.postMessage("5");
</script>
</body>
</html>
Javascript (рабочий код):
var results = [];
function resultReceiver(event) {
results.push(parseInt(event.data));
if (results.length == 2) {
postMessage(results[0] + results[1]);
}
}
function errorReceiver(event) {
throw event.data;
}
onmessage = function(event) {
var n = parseInt(event.data);
if (n == 0 || n == 1) {
postMessage(n);
return;
}
for (var i = 1; i <= 2; i++) {
var worker = new Worker("fibonacci.js");
worker.onmessage = resultReceiver;
worker.onerror = errorReceiver;
worker.postMessage(n - i);
}
};
У меня есть следующие вопросы:
Когда именно рабочий код начинает работать? Сразу после исполнения
var worker = new Worker("fibonacci.js");
?Это правда, что назначение
onmessage = function(event) { ... }
в рабочем коде будет выполнено доworker.postMessage("5");
в основном коде?Может ли рабочий код получить доступ к глобальным переменным, определенным в основном коде (например,
worker
)?Может ли основной код получать доступ к глобальным переменным, определенным в рабочем коде (например,
results
)?Мне кажется, что
worker.onmessage = function(event) {...}
в основном коде имеет такое же значение, какonmessage = function(event) {...}
в коде работника (который являетсяonmessage
обработчик события работника). Где я ошибаюсь? В чем разница между ними?Что должен делать этот код? Когда я запускаю его here, он просто печатает «5». Это то, что он должен делать, или я что-то упускаю?
Большое спасибо!
Если вы еще этого не сделали, дайте спецификации (http://www.w3.org/TR/workers/) прочитать. Он * должен * охватывать большинство или все это. –
Я должен сказать, что калькулятор Фибоначчи невелик в списке вещей, которые я выбрал, чтобы создать пример веб-работников! :-) Не, если я хотел сделать что-то, что было бы простым и ясным примером. Это может быть полезно: http://ejohn.org/blog/web-workers/ BTW, я также получаю '5', когда я запускаю этот пример в Firefox; Я подозреваю, что это возможно было написано на ранней версии веб-работников и/или 'postMessage', а Firefox 3.6 (теперь) поддерживает более позднюю итерацию. (Это очень ультрасовременный материал.) –
Я хочу изучить этот материал на примерах, и я видел несколько примеров, прежде чем писать это. У меня все еще есть основные недоразумения в том, как это работает. Я был бы рад, если бы кто-нибудь мог ответить на мои вопросы. Чтение Spec слишком болезненно для меня прямо сейчас. –