web-dev-qa-db-ja.com

モジュールの読み込みエラーをキャッチして処理する

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イベントにどのようにバインドしますか?何か案が?

40
Chin

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()メソッドを呼び出して取得します。

38
Louis

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)
})
19
Shanimal

here のようにrequirejs.onErrorをオーバーライドしようとしましたか?

このようにcatchErrorをtrueに設定した後、私にとってはうまくいきました:

_require.config({catchError:true});
_

define()またはrequire()関数を呼び出す前。

7

Requirejs.onError関数を次のように使用できます。

requirejs.onError = function (err) {
    if (err) {
        //Reload
    } 
    else {
        throw err;
    }   
};

err.requireTypeを使用して、タイムアウトなどの特定のエラーをキャッチすることもできます

3
anurag_29