JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

ChromeでHTML5 Geolocationのタイムアウト時にコールバックが呼ばれない問題の対処法

ChromeにおけるGeolocation APIのタイムアウト問題

HTML5のGeolocation APIを使って位置情報を取得する際、Google Chromeではタイムアウトが発生してもerrorCallback(エラーコールバック)が呼ばれないという挙動が確認されています。仕様上はtimeoutオプションを指定すれば、指定時間内に位置情報が取得できなかった場合にエラーコールバックが実行されるはずですが、Chromeではこれが機能しないケースがあります。

この問題に対する回避策として、コールバックが実行されたかどうかをフラグで管理し、別途setTimeoutで監視する方法があります。以下にその実装例を示します。

回避策のコード例

_callback = false;

function successCallback(position) {
    _callback = true;
    console.log('success');
}

function errorCallback(error) {
    _callback = true;
    alert('error');
}

// コールバックが一定時間内に呼ばれなかった場合を検知
setTimeout(function(){
    if(!_callback) console.log('ignored');
}, 20000);

navigator.geolocation.getCurrentPosition(
    successCallback,
    errorCallback,
    {timeout: 2000}
);

コードの解説

このコードのポイントは以下の通りです。

  • フラグ変数 _callback:成功・失敗どちらのコールバックが実行されてもtrueにセットされます。
  • setTimeoutによる監視:20秒後にフラグを確認し、まだfalseのまま(=どちらのコールバックも呼ばれていない)であれば、リクエストが無視されたものとして処理します。
  • timeout: 2000:Geolocation API自体には2秒のタイムアウトを指定していますが、Chromeがこれを無視する場合でも、外側のsetTimeoutがフォールバックとして機能します。

このように、API側のタイムアウト設定だけに頼らず、アプリケーション側で独自のタイムアウト処理を実装しておくことで、Chromeを含むさまざまなブラウザ環境でも安定した動作を実現できます。

  1. Chrome Canary(カナリア)とは?安全性や使い方を徹底解説

    Google Chromeは、世界中で何億人ものアクティブユーザーを持つブラウザであり、新機能やバグ修正は一般公開前に厳しいテストを経てリリースされます。もし標準版のChromeユーザーよりも先にこれらの機能や修正を試してみたいなら、最先端バージョンである「Google Chrome Canary」への切り替えがおすすめです。 Google Chromeには、Stable(安定版)、Beta、Dev、Canaryの4つのリリースチャンネルが用意されています。Canaryはその中でも最も実験的なチャンネルで、限られたユーザー層(主に開発者やテスター)に新機能を試してもらい、バグや問題を報告して

  2. Chrome と Edge で RESULT_CODE_HUNG を修正

    複数のブラウザーがインターネット ドメインの拠点を占めていますが、Google Chrome と Microsoft Edge はそのリストの中で際立っています。 Chrome は世界中の何百万人ものユーザーにとって頼りになる選択肢ですが、私の数人の Windows ユーザーには Edge が好まれています。しかし、これらの優れたブラウザーにもいくつかの欠陥があります。ユーザーは、インターネット サーフィン中にいくつかのよくあるエラーに気を取られることがよくあります。そのようなよくあるエラーの 1 つに Aw Snap! RESULT_CODE_HUNG . Chrome、Edge、Brave