2

このコードをオブジェクトに含めて、適用される領域から分離することにしました。ここでのアドバイスは本当にありがたいです:

appConfig.loadElementとappConfig.cerrorElementは、次のHTML要素です。

<div id="loading" style="display:none;">Loading...</div>
<div id="cerror" style="display:none;">Connection Error.</div>


var loadingTimeoutInstance = null, cerrorTimeoutInstance = null,
    requestObj = {
    reset: function() {
        $(appConfig.loadElement).hide();
        $(appConfig.cerrorElement).hide();
        clearTimeout(loadingTimeoutInstance);
        clearTimeout(cerrorTimeoutInstance);
    },
    initiate: function() {
        loadingTimeoutInstance = setTimeout(requestObj.timeout, appConfig.loadingDelayMS);
    },
    timeout: function () {
        clearTimeout(loadingTimeoutInstance);
        $(appConfig.loadElement).show();
        cerrorTimeoutInstance = setTimeout(requestObj.cerror, appConfig.cerrorDelayMS);
    },
    cerror: function () {
        clearTimeout(cerrorTimeoutInstance);
        $(appConfig.loadElement).hide();
        $(appConfig.cerrorElement).show();
    }
}

実装は次のようになります。

非同期リクエストが行われた場合:

requestObj.reset();
requestObj.initiate();

応答が返された後:

requestObj.reset();

私が特定した問題は、主にrequestObj.reset()にあります。-要素がすでに非表示になっているのに、なぜ非表示にするのですか?-タイムアウト変数(loadingTimeoutInstanceおよびcerrorTimeoutInstance)がまだタイムアウトとして設定されていない場合、それらをクリアできません-これにより、タイムアウト変数が機能しなくなります。

4

1 に答える 1

4

それが特定のタイプであるかどうかを実際にチェックする必要はありません...それだけです。

if(cerrorTimeoutInstance) clearTimeout(cerrorTimeoutInstance);

于 2012-06-06T23:21:51.877 に答える