2013-08-20 27 views
6

ロードフレームワークとしてrequire.jsを使用してモバイルハイブリッドアプリケーションを作成しています。読み込みエラーに問題があります。私がやろうとしているのは、デバイスがオフラインで、画面上に地図を表示するために必要なGoogleマップAPIスクリプトをダウンロードできないときに、フォールバックソリューションをセットアップすることです。私が得るものはすべてrequireJsタイムアウトエラーを処理する方法は?

Uncaught Error: Load timeout for modules: async!http://maps.googleapis.com/maps/api/js?sensor=true 

ですが、私はこのエラーをキャッチして代替実装を提供することはできません。ここに私のgmapsモジュールの定義

define('gmaps', ['async!http://maps.googleapis.com/maps/api/js?sensor=true'],function(){ 
    return window.google.maps; 
}); 

は、私は何ができますか?

EDIT

私は可能な解決策をあなたの助けのおかげで見つけることができました。私のセットアップは、この

require.config({ 
    paths: {   
     gmaps: ['http://maps.googleapis.com/maps/api/js?sensor=true', 'lib/dummymaps'] 
    } 
} 

dummymapsよう要求してきただけの単純なモジュールです:私は私の「親」モジュールで次に

define({ 
    dummy: true 
}); 

define(["gmaps"],function(gmaps){ 
    ... 
    if(typeof gmaps.dummy != 'undefined' && gmaps.dummy == true){ 
     // use a local image as map 
    } else { 
     // initialize google maps canvas 
    } 
}); 

はそれがだ、あなたと思いますか良い解決策?

EDIT 2:

が私を許し、それがこのコードで働いていません。 gmapsは完全にロードするために非同期プラグインを使用する必要があり、プラグインで動作させることができないため、代替実装にはいつも戻っています。

+0

何をするにしてもプロトコルの相対URL(//で始まる)に行くと、httpとhttpsで問題に陥ることはありません。これらの問題はブラウザ固有のもので、警告が表示されたり、JS-Filesがまったく読み込まれないことがあります。 例:http://cdnjs.com/ – nekaab

+0

ありがとう、私はついにこの種のURLが今日使われている理由を知りました! – sangaran

+0

私もこの問題を抱えています。タイムアウトエラーはどこにあるのですか?私はそれをローカルで、またはグローバルエラーハンドラでキャッチすることはできません。 Googleアナリティクスが原因で問題が発生している場合は、モジュールのロードを続行するだけです。 –

答えて

2

次の操作を試みることができる:

requirejs.config({ 
    paths: { 
     // define an alias here, first try remote, if it fails it will try your local file 
     'gmaps': ['http://maps.googleapis.com/maps/api/js?sensor=true', 'your local file.js'] 
    } 
}); 

define('gmaps', function(gm) { 
    // var gm should now be the google maps plugin 
    console.log(gm); 
}); 
+0

これに基づいて解決策を含めるために答えを編集しました。 。 – sangaran

0

RequireJSのドキュメントは、あなたの特定のケースをカバーしますa section on errorsを持っています。

詳細falling back to a local copy of jQuery CDNが利用できない場合は、

+0

これは同じではありません。私はgmapsの実装を置き換えたくありません。私は自分のモジュールの1つをgmapsに依存させたいと思いますが、gmapsが実際のものではない場合、モジュールはその動作を変更する必要があります。出来ますか? – sangaran

6

あなたがすることで、エラーをキャッチすることができます

requirejs.onError = function (err) { 
    if (err.requireType === 'timeout') { 
     alert("error: "+err); 
    } 
    else { 
     throw err; 
    } 
}; 

は、この情報がお役に立てば幸い!

1

あなたの元の問題は決してあなたが望むように決して解決されなかったと私は信じています、そして、私たちはここで同じ種類の問題に遭遇しました。基本的には、Googleマップがタイムアウトしたときや利用できなかったときに正常に復旧する方法が必要でした。アプリケーションがインターネットにアクセスできないユーザーのマシンで実行されることがあるからです。

私はもともとasync!を使用していました。他の人が使っているプラ​​グインですが、私が必要とするエラー処理を可能にする修正ができませんでした。

したがって、requireJSコンテナの外部に非同期でGoogleマップをロードし、エラーコールバック処理を提供する独自のユーティリティクラスを作成しました。見て、それがあなたの問題を解決するかどうかを確認してください。 Googleでは、maps.googleを使用すると、ユーザーに警告を表示することができます。comが到達できない、とアプリケーションの残りの部分は正常にロードします:

https://github.com/mag382/googleMapsLoaderUtil

2

私は同じ問題を抱えていたし、私はこのスニペットでそれを解決する:間違いなく、

require(['async!http://maps.google.com/maps/api/js?sensor=false'], function() { 
    //Success processing 
}, function (e) { 
    //Error processing 
}); 
関連する問題