局勢: 太多的東西在一個頁面的主線程中運行,使得覆蓋圖代表來自美國人口普查數據的ZIP區域以及客戶要求將區域分組爲離散組的區域。雖然桌面上沒有主要問題,但移動設備(iPad)認爲該線程花費的時間太長(數據返回後最長爲6秒),因此必須崩潰。在網絡工作者中使用Google地圖對象?
解決方案:卸載循環功能,從每行收集形狀的點到Web工作人員,這些工作人員可以在移動設備上資源允許的情況下工作得如此快或慢。 (三個for循環,第一個選擇行,第二個選擇列,第三個用於列內的每個點。執行時間:超過2000多行,總共3-6秒,有多個點)
The catch:In爲了達到這個效果,這些點必須被製作成網絡工作者的形狀(多邊形)。然而,因爲它是一個由google.maps.latlng對象組成的google.maps.polygon對象,所以[web worker]需要了解這些項目在web worker中的內容。 Web工作人員要求您不要使用窗口或DOM,因此它必須導入腳本,意圖是僅將對象作爲JSON編碼項目傳回。即使使用importScript(),由於這些項目依賴於窗口元素,代碼也無法引用任何google對象。
更復雜:Google的API在技術上是專有的。這是用於網絡應用程序的代碼是由NDA綁定的,因此可能會提出尖銳的問題,而不是所有代碼的複製/粘貼。
該解決方案/任何模糊的想法:???
TLDR:需要訪問google.maps.latlng對象並在web worker內創建(最低限度)新實例。 Web工作人員應該返回準備被彈出的對象到一個google.maps.polygon對象中,或者返回一個google.maps.polygon對象。如果由於需要窗口對象的問題而無法使用導入腳本的默認方法,我該如何引用google maps API?
UPDATE:因爲寫這篇文章的Ive設法從主線程的網絡工作者允許它通過數據異步解析和分配數據卸載大部分繁重的工作來定製的經緯度對象。
現在趕上正在獲取返回的值在適當的上下文中運行該函數,以查看自定義latlng是否足以讓google.maps.polygon發揮它的魔力。從調用網絡工作者,並監聽其響應文件
摘錄(CoffeeScript的)
@shapeWorker.onmessage= (event)->
console.log "--------------------TESTING---------------"
data=JSON.parse(event.data)
console.log data
@generateShapes(data.poly,data.center,data.zipNum)
出於某種原因,它試圖在網絡工作者的背景下,而不是在的背景下,以評估GenerateShapes它的類。
您可以使用postMessage()從主線程'請求'信息。將請求傳遞給一個可以返回相應JSON字符串的函數。 https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers – daekano
我會要求importScript()在這種情況下不能提供什麼? – TechImp
只是在這裏黑暗...如果你每隔一秒更新DOM的一部分,ipad會不會認爲它已經崩潰? – TonyWilk