如何将繁重的地理编码转移给网络工作者?
how to move heavy geocoding to a web-worker?
我有一个非常大的地理点列表,我想用地理编码器将其转换为坐标,我认为最好的方法是将任务移交给网络工作者,否则 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: document is not defined in mapsjs-core.js:158:623。过了一会儿另一个错误:
NetworkError:发生网络错误。来自 datapointscollection.js:1
您导入工作器的文件似乎依赖于 DOM 现有文件。你的 web worker 没有 DOM,所以你将不得不使用不需要 DOM 的依赖项(如果它能在节点中工作,它会在没有 DOM 的情况下工作).检查您的依赖项的文档,看看是否有适用于节点的版本或不需要 DOM,并在您的网络工作者中使用该版本。 (它可能只是 mapsjs-service.js
文件。看看你是否可以摆脱它)。
对于大量的地理编码,您应该考虑批量地理编码。
在 developer.here.com
查看开发者指南
我有一个非常大的地理点列表,我想用地理编码器将其转换为坐标,我认为最好的方法是将任务移交给网络工作者,否则 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: document is not defined in mapsjs-core.js:158:623。过了一会儿另一个错误: NetworkError:发生网络错误。来自 datapointscollection.js:1
您导入工作器的文件似乎依赖于 DOM 现有文件。你的 web worker 没有 DOM,所以你将不得不使用不需要 DOM 的依赖项(如果它能在节点中工作,它会在没有 DOM 的情况下工作).检查您的依赖项的文档,看看是否有适用于节点的版本或不需要 DOM,并在您的网络工作者中使用该版本。 (它可能只是 mapsjs-service.js
文件。看看你是否可以摆脱它)。
对于大量的地理编码,您应该考虑批量地理编码。 在 developer.here.com
查看开发者指南