C
C
Cleep2018-02-04 19:45:24
JavaScript
Cleep, 2018-02-04 19:45:24

Why does Javascript Worker not work?

Good day, friends. I was learning Javascript and I came across such a problem - the code for counting prime numbers in the background does not work. The tutorial said that this can be done using the Worker method. Actually, here is the base code:

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 + ") ...";   
   }

And here is the PrimeWork.js code, respectively:
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;
    }

Answer the question

In order to leave comments, you need to log in

1 answer(s)
0
0xD34F, 2018-02-04
@Cleep

Do you think it's normal that the function used as the onmessage handler in the main thread of execution is defined in the worker file?
UPD. And another bug:
So how is it right - PrimeWorker or PrimeWork? You already decide.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question