@Cleep

Почему не работает Worker на Javascript?

Доброго времени суток, друзья. Изучал 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;
    }
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
А что, по-вашему это нормально, что функция, использующаяся в качестве обработчика onmessage в основном потоке выполнения, определяется в файле воркера?

UPD. И ещё косяк:

new Worker("PrimeWorker.js");

А вот соответственно и код PrimeWork.js:

Так как всё-таки правильно - PrimeWorker или PrimeWork? Вы уж определитесь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы