Как перенести тяжелое геокодирование на веб-работника? - PullRequest
0 голосов
/ 29 декабря 2018

У меня очень большой список географических точек, которые я хочу перевести в координаты с геокодером, и лучший способ, как мне кажется, это перенести задачу на веб-работника, в противном случае Firefox отключается и не загружает страницу.

// the main html file:
var myWorker = new Worker('datapointscollection.js');
  myWorker.onmessage = function(e) {
      document.getElementById('loadingStatus').innerHTML = count + " elements from " + all + "are ready.";
      if (count == all) {
        myWorker.terminate();
        myWorker = undefined;
      }
  };

   myWorker.postMessage([geocodingParams]);

// the worker js file:
self.importScripts("http://js.api.here.com/v3/3.0/mapsjs-core.js");
self.importScripts("http://js.api.here.com/v3/3.0/mapsjs-service.js");
self.importScripts("http://js.api.here.com/v3/3.0/mapsjs-ui.js");
self.importScripts("http://js.api.here.com/v3/3.0/mapsjs-mapevents.js");
self.addEventListener(
'message', 
function(e) {
  var count = 0;
  var all = 0;

  // Initialize the platform object:
  var platform = new H.service.Platform({
  'app_id': 'myappID',
  'app_code': 'myappCODE'
  });

  var geocoder = platform.getGeocodingService();

  var onResult = function(result) {};

  var findLocations = function(geocodingParams) {
    var i=0;
    all = geocodingParams.length;
    for (i=0; i<geocodingParams.length; i++) {
      geocoder.geocode(
        geocodingParams[i], 
        onResult, 
        function(e){
            alert(e);
        } );
      count = i;
      self.postMessage(count, all);
    }
  };

  findLocations(e.data[0]);
}, 
false);

Я пробовал разные подходы, но выполнение рабочего скрипта завершается неудачно с разными ошибками.Последняя проблема - ReferenceError: документ не определен в mapsjs-core.js: 158: 623.и через некоторое время другая ошибка: NetworkError: Произошла ошибка сети.из datapointscollection.js: 1

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Для огромного количества геокодов, вы должны рассмотреть пакетное геокодирование.Посмотрите руководство разработчика на developer.here.com

0 голосов
/ 29 декабря 2018

Похоже, что файлы, которые вы импортируете в свой рабочий, зависят от существующей DOM.У вашего веб-работника нет DOM, поэтому вам придется использовать зависимости, которые не нуждаются в DOM (если он будет работать в узле, он будет работать без DOM).Проверьте документацию на ваши зависимости, чтобы увидеть, есть ли версия, которая работает в узле или не нуждается в DOM, и используйте эту версию в своем веб-работнике.(Это может быть просто файл mapsjs-service.js. Посмотрите, сможете ли вы справиться с этим).

См. Также API Web Workers

...