Require.jsを使用してコンテンツをロードしようとしています。コンテンツが存在しない場合、エラーをキャッチしてユーザーに通知したいと思います。
Firebugでは、2つのエラーが表示されます。
「NetworkError:404 Not Found
...そして数秒後:
var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#
Load timeout for modules: modules/messages/messages
http://requirejs.org/docs/errors.html#timeout
私のコードは次のようになります。
require([path], function(content){
//need to catch errors as this will not be called;
});
Requirejsイベントにどのようにバインドしますか?何か案が?
Errbacksを使用して、require
の特定の使用に適したカスタマイズされたエラー処理を行うこともできます。エラーバックはここに記載されています http://requirejs.org/docs/api.html#errbacks 。基本的に、ロードが失敗した場合に呼び出される関数をrequire
に追加できます。ロードが成功した場合、関数の直後に呼び出されます。
Chinのケースは次のように処理できます。
_require([path], function(content){
//need to catch errors as this will not be called;
}, function (err) {
//display error to user
});
_
以下は、複数の場所からロードしようとする例です。
_require([mode_path], onload, function (err) {
if (mode_path.indexOf("/") !== -1)
// It is an actual path so don't try any further loading
throw new Error("can't load mode " + mode_path);
var path = "./modes/" + mode_path + "/" + mode_path;
require([path], onload,
function (err) {
require([path + "_mode"], onload);
});
});
_
この例では、onload
は必要なコードが読み込まれると呼び出される関数になり、_mode_path
_はモードを識別する文字列になります。表示されるのは、3つの異なる場所からエディターのモードモジュールをロードしようとするコードです。 _mode_path
_がfoo
の場合、foo
、次に_./modes/foo/foo
_、次に_./modes/foo/foo_mode
_をロードしようとします。
Requirejs.orgの例は、よく知られた識別子で利用できるようにしたいリソースの複数の場所を試したい場合の対処方法を示しています。おそらく、この例のコードベース全体では、「jquery」を要求することによりjQueryが必要です。 jQueryの場所に関係なく、コードベース全体で「jquery」として使用できるようになります。
私の例では、この特定のケースではそうする正当な理由がないため、よく知られた識別子を介してコードベース全体にモードを知らせることを気にしません。 onload
関数は取得したモジュールを変数に格納し、残りのコードベースはgetMode()
メソッドを呼び出して取得します。
requirejs onError関数を設定します。
requirejs.onError = function (err) {
if (err.requireType === 'timeout') {
// tell user
alert("error: "+err);
} else {
throw err;
}
};
イベントを設定する場合は、グローバルオブジェクトにバインドしてトリガーできます。といった:
$("body").bind("moduleFail",function(){
alert("Handling Event")
});
requirejs.onError = function (err) {
if (err.requireType === 'timeout') {
$("body").trigger({type:"moduleFail",err:err})
} else {
throw err;
}
};
require(["foo"],function(foo){
alert("loaded foo" + foo)
})
here のようにrequirejs.onErrorをオーバーライドしようとしましたか?
このようにcatchErrorをtrueに設定した後、私にとってはうまくいきました:
_require.config({catchError:true});
_
define()
またはrequire()
関数を呼び出す前。
Requirejs.onError関数を次のように使用できます。
requirejs.onError = function (err) {
if (err) {
//Reload
}
else {
throw err;
}
};
err.requireType
を使用して、タイムアウトなどの特定のエラーをキャッチすることもできます