Multithreading 在web worker中使用Google地图对象?

Multithreading 在web worker中使用Google地图对象?,multithreading,google-maps,web-applications,google-maps-api-3,web-worker,Multithreading,Google Maps,Web Applications,Google Maps Api 3,Web Worker,情况: 在一个页面的主线程中运行了太多的内容,制作了一个谷歌地图,上面覆盖着来自美国人口普查数据的代表ZIP地区的内容,以及客户要求将地区分组为谨慎的组的内容。虽然台式机上没有什么大问题,但移动设备(iPad)认为线程占用的时间太长(数据返回后最多6秒),因此一定是崩溃了 解决方案:卸载循环功能,将形状的点从每行收集到web worker,web worker可以在移动设备上以资源允许的速度或速度工作。(三个用于循环,第一个用于选择行,第二个用于选择列,第三个用于列中的每个点。执行时间:对于超过

情况: 在一个页面的主线程中运行了太多的内容,制作了一个谷歌地图,上面覆盖着来自美国人口普查数据的代表ZIP地区的内容,以及客户要求将地区分组为谨慎的组的内容。虽然台式机上没有什么大问题,但移动设备(iPad)认为线程占用的时间太长(数据返回后最多6秒),因此一定是崩溃了

解决方案:卸载循环功能,将形状的点从每行收集到web worker,web worker可以在移动设备上以资源允许的速度或速度工作。(三个用于循环,第一个用于选择行,第二个用于选择列,第三个用于列中的每个点。执行时间:对于超过2000多个具有多个点的行,总共约3-6秒)

陷阱:为了使其正确有效,必须在web worker中将这些点制作成一个形状(多边形)。但是,由于它是由google.maps.latlng对象组成的google.maps.polygon对象,因此[网络工作者]需要了解这些项目在网络工作者中的位置。Web workers要求您不要使用window或DOM,因此它必须导入脚本,其目的是将对象作为JSON编码的项传回。由于这些项目依赖于窗口元素,因此即使使用importScript()也无法对google对象进行任何引用

更复杂的是:谷歌的API在技术上是专有的。本文件所针对的web应用程序代码受NDA约束,因此可以提出有针对性的问题,但不能复制/粘贴所有代码

解决方案/任何模糊的想法:

TLDR:需要访问google.maps.latlng对象并在web worker中创建新实例(至少)。Web worker应该返回准备弹出到google.maps.polygon对象中的对象,或者返回google.maps.polygon对象。如果由于需要窗口对象的问题而无法使用默认的脚本导入方法,如何引用google maps API

更新:自写这篇文章以来,我设法将大部分繁重的工作从主线程转移到web worker,允许它异步解析数据并将数据分配给定制的latlng对象

现在的问题是获取返回值,以便在适当的上下文中运行该函数,以查看自定义latlng是否足以让google.maps.polygon发挥其魔力

摘自调用web worker并侦听其响应的文件(Coffeescript)


出于某种原因,它试图在web worker的上下文中而不是在其类的上下文中评估GenerateShape

又一次,这是太多事情同时发生的结果。由于使用了->而不是=>扩展了作用域以允许父类函数,因此限制了作用域


显然,问题在于这个web应用程序需要运行的iOS版本,以及存储空间被设置得任意低(是以前大小的十分之一)的bug。随着数据的缩减和iOS版本的修复,我能够在不使用网络工作者的情况下运行它。有一天,我可能会和网络工作者一起回到it上来,以提高效率

您可以使用postMessage()从主线程“请求”信息。将请求传递给可以返回相应JSON字符串的函数。在本例中,如果importScript()无法提供,我会请求什么?这里只是在黑暗中拍摄。。。如果你每隔一秒钟左右更新一次DOM的一部分,ipad会不会认为它已经崩溃了?试着把数据分成这样的块。仍然基本上到了终点,并决定线程“挂起”,尽管距离一行(实际上不是,但它完成绘制多边形,然后崩溃)。问题发生在最新的Ipad上,而不是上一代的Ipad。您是否需要一次性计算并初始化所有2000+点?为什么不使用webstorage并限制范围,然后执行循环?
@shapeWorker.onmessage= (event)->
    console.log "--------------------TESTING---------------"
    data=JSON.parse(event.data)
    console.log data
    @generateShapes(data.poly,data.center,data.zipNum)