Доброго времени суток, друзья. Изучал Javascript и столкнулся с такой проблемой - код для подсчета простых чисел в фоновом режиме не работает. В обучении говорилось, что это можно сделать при помощи метода Worker. Собственно, вот код основы:
function doSearch() {
// Отключаем кнопку запуска вычислений, чтобы пользователь не мог
// запускать несколько процессов поиска одновременно
searchButton.disabled = true;
// Получаем начальное и конечное число диапазона поиска
var fromNumber = document.getElementById("from").value;
var toNumber = document.getElementById("to").value;
// Создаем поток
var worker = new Worker("PrimeWorker.js");
// Подключаем функцию к событию onMessage, чтобы получать
// сообщения от потока
worker.onmessage = receivedWorkerMessage;
worker.postMessage(
{ from: fromNumber,
to: toNumber
}
);
// Информируем пользователя, что вычисления выполняются
statusDisplay.innerHTML = "Фоновый поток ищет простые числа (от "+
fromNumber + " до " + toNumber + ") ...";
}
А вот соответственно и код PrimeWork.js:
onmessage = function(event) {
// Выполняем поиск простых чисел в указанном диапазоне чисел.
// Диапазон извлекается из свойства event.data
var primes = findPrimes(event.data.from, event.data.to);
// Поиск завершен. Отправляем результаты веб-странице
postMessage(primes);
};
function findPrimes(fromNumber, toNumber) {
// Создать массив целых чисел в указанном диапазоне
var list = [];
for (var i=fromNumber; i<=toNumber; i++) {
if (i>1) list.push(i);
}
// Выбираем простые числа
var maxDiv = Math.round(Math.sqrt(toNumber));
var primes = [];
for (var i=0; i<list.length; i++) {
var failed = false;
for (var j=2; j<=maxDiv; j++) {
if ((list[i] != j) && (list[i] % j == 0)) {
failed = true;
} else if ((j==maxDiv) && (failed == false)) {
primes.push(list[i]);
}
}
}
return primes;
}
function receivedWorkerMessage(event) {
// Получаем список простых чисел
var primes = event.data;
// Отображаем список в соответствующей области страницы
var primeList = "";
for (var i=0; i<primes.length; i++) {
primeList += primes[i];
if (i != primes.length-1) primeList += ", ";
}
var primeContainer = document.getElementById("primeContainer");
primeContainer.innerHTML = primeList;
if (primeList.length == 0) {
statusDisplay.innerHTML = "Ошибка поиска.";
}
else {
statusDisplay.innerHTML = "Простые числа найдены!";
}
// Разблокируем кнопку запуска поиска
searchButton.disabled = false;
}