情况: 在页面的主线程中运行了太多的东西,使得谷歌地图的覆盖层代表来自美国人口普查数据的ZIP地区以及客户要求将地域分组为谨慎组的内容。虽然桌面上没有重大问题,但移动设备(iPad)决定线程占用时间过长(数据返回后最多6秒),因此必须崩溃。
解决方案:卸载循环功能,将每行形状的点数收集到一个Web工作者,该工作者可以像移动设备上的资源允许一样快或慢地工作。 (三个用于循环,第一个用于选择行,第二个用于选择列,第三个用于列中的每个点。执行时间:总共3-6秒,超过2000多行,有多个点)
捕获:为了使其具有适当的效率,必须将点设置为Web worker中的形状(多边形)。但是,由于它是由google.maps.latlng对象组成的google.maps.polygon对象,因此[web worker]需要了解这些项目在Web worker中的含义。 Web worker要求您不要使用窗口或DOM,因此它必须导入脚本,目的是将对象作为JSON编码项传回。由于这些项依赖于窗口元素,因此即使使用importScript(),代码也会在google对象的任何引用上失败。
进一步的复杂化:Google的API在技术上是专有的。这个用于的网络应用程序代码受NDA约束,因此可以询问有针对性的问题,但不能复制/粘贴所有代码。
解决方案/任何模糊的想法:???
TLDR:需要访问google.maps.latlng对象并在Web worker中创建(最低限度)新实例。 Web worker应该返回准备好弹出的对象到google.maps.polygon对象,或者应该返回一个google.maps.polygon对象。如果由于需要窗口对象的问题而无法使用导入脚本的默认方法,如何引用google maps API?
UPDATE :自从写这篇文章以来,我设法将大部分繁琐的工作从主线程卸载到Web工作者,允许它异步解析数据并将数据分配给自定义的latlng对象
现在捕获的是获取返回值以在适当的上下文中运行该函数,以查看自定义latlng是否足以让google.maps.polygon发挥其魔力。
摘自调用Web worker并侦听其响应的文件(Coffeescript)
@shapeWorker.onmessage= (event)->
console.log "--------------------TESTING---------------"
data=JSON.parse(event.data)
console.log data
@generateShapes(data.poly,data.center,data.zipNum)
出于某种原因,它试图在Web worker的上下文中而不是在类的上下文中评估GenerateShapes。
答案 0 :(得分:0)
再一次,这是太多事情同时发生的并发症。由于使用了 - >,范围受到限制。而不是=>它扩展了范围以允许父类函数。
显然问题在于此网络应用程序需要运行的iOS版本以及存储设置任意低(前一个大小的十分之一)的错误。随着数据的缩小和对iOS版本的修复,我能够在不使用Web worker的情况下运行它。有一天,我可以与网络工作者一起回到它,以提高效率。