我正在开发一个webApp,它在地图上显示群集闪电事件(因此一个巨大的群集就像一个雷暴形成)。
为了避免“冻结”用户界面,我正在使用Javascript Worker来执行群集。算法结束时会出现问题,因为它会在我将其发送到主页后返回一个“丢失”某些属性的自定义对象:
//inside Worker.js
var cluster = new DBSCAN(e.data.params).run();
self.postMessage({"cluster": cluster});
集群对象基本上是 GeoPoint 对象的数组,因此:
cluster[0]
是像这样的GeoPoint对象
function GeoPoint(lat, lng){
this.lat_ = lat;
this.lng_ = lng;
}
GeoPoint.prototype.lat = function(){ return this.lat_;}
GeoPoint.prototype.lng = function(){ return this.lng_;}
当我使用self.postMessage
发送此对象时,我丢失了lat()
和lng()
函数,我需要来绘制多边形。 lat_
和lng_
属性完整无缺。
我能做些什么来克服这个问题?现在我只是循环结果并重建GeoPoint
个对象,它可以工作,但看起来很糟糕。
感谢您的任何建议!
编辑:我需要这些函数,因为绘图代码将在lat lon点上执行排序,然后才能计算凸包。
答案 0 :(得分:0)
根据文档,postMessage
使用结构化克隆算法。函数和原型不会转移:
收到数据后可以尝试的是更改收到的对象的原型:
worker.onmessage = function(event) {
var data = event.data;
data.forEach(function(p) {
p.__proto__ = GeoPoint.prototype; // That seems to work, but I'm really not sure if this is standard and compatible with all browsers !
});
};
答案 1 :(得分:0)
我能做些什么来克服这个问题?
没有 - postMessage
使用的cloning algorithm不会传输原型和函数。在另一方重建它们是必要的。
现在我只是简单地循环结果并重建GeoPoint对象,但它看起来非常糟糕。
不,这就是需要做的事情:
var newCluster = messageData.cluster.map(function(likeapoint) {
var point = new GeoPoint();
for (p in likeapoint) // maybe a static list of copied property names
point[p] = likeapoint[p];// is faster, but not as flexible
return point;
})
// since all properties are settable as arguments in this specific case:
var newCluster = messageData.cluster.map(function(likeapoint) {
return new GeoPoint(likeapoint.lat_, likeapoint.long_);
})