このコードをオブジェクトに含めて、適用される領域から分離することにしました。ここでのアドバイスは本当にありがたいです:
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)がまだタイムアウトとして設定されていない場合、それらをクリアできません-これにより、タイムアウト変数が機能しなくなります。