2

javascript を介して goolge earth api 関数 'fetchKml' を呼び出しています。大きなファイルをフェッチすると、Firefox で「このページのスクリプトがビジーであるか、応答を停止している可能性があります。スクリプトを今すぐ停止するか、デバッガーでスクリプトを開くか、スクリプトを続行することができます。」というポップアップが表示されます。

Google グループの問題 331 で同様の質問に気付きました (「fetchKml は、低速接続または高速接続と大きな KML/KMZ ファイルで失敗します」)。残念ながら、その問題は2009年に発生しました。現在は2012年です。タイムアウトの問題を発生させずにファイルをプログラム的にロードするにはどうすればよいですか?

ありがとうございました。

4

1 に答える 1

1

根本的な原因は、fetchKmlが同期的であることです。KML ファイルがネットワーク経由で取得され、解析され、指定されたコンテンツがプラグインに読み込まれるまでブロックされます。これらのステップのいずれかに時間がかかりすぎる場合 (サーバーの応答が遅い、ファイルが非常に大きい、コンテンツが複雑すぎる)、関数呼び出しに時間がかかりすぎると、ブラウザでスクリプトの速度が遅いという警告が表示されます。単純な時間ベースのウォッチドッグ ループでトリガーします。

これを回避するには、いくつかの方法があります。

  • 最も簡単な方法は、コンテンツをいくつかの個別の KML ファイルに分割し、それぞれをロードすることsetTimeoutですfetchKml()。これは、主な問題がレイテンシーである場合には役に立ちませんが、これは大きな KML ファイルで発生していると述べたので、おそらくここでは当てはまりません。

  • 慣用的な方法は、KML でNetworkLinksを使用してこれらの他のファイルをロードすることです。最初の呼び出しは同期されますが、(更新メカニズムの設定fetchKml方法に応じて) 以降のコンテンツは、javascript 実行スレッドをブロックすることなく、独自の時間にプラグインによってロードされます。

  • 最後に、自分の手で問題を解決する方法があります。ブラウザのネイティブXMLHttpRequest機能を使用して KML ファイルをロードできます。これはデフォルトで非同期です。ファイルがロードされると、コールバック関数に通知され、 parseKml()を使用してそのファイルをプラグインにロードし、そのコンテンツを表示できます。これparseKmlも同期であるため、ファイルが解析されてコンテンツが作成されている間はブロックされますが、最初にファイルをダウンロードする場合と比べて、通常は非常に高速なステップです。

于 2012-07-22T23:22:01.993 に答える