0
var SetInactivityTimeOut = function () {
    try {
        var TimeoutInterval = parseInt(10, 10);

        var PreviousTimeStamp = Math.round(new Date().getHours() * 60 + new Date().getMinutes());

        if (TimeoutInterval === 0) return;

        TimeoutInterval = TimeoutInterval * 60 * 1000; //Converting to milisecond
        var TimeOutObj;
        if (TimeOutObj != null && TimeOutObj != undefined) {
            clearTimeout(TimeOutObj);
        }
        //Ti.API.info('TimeOutObj---'+TimeOutObj);
        TimeOutObj = setTimeout(function () {
            open the main page
        },TimeoutInterval);

    } catch (e) {
        error(e);
    }
}

これは、ボタンをクリックするたびに使用している機能です。10 分間のアイドル時間が終了すると、インデックス ページが開きます。しかし、そこからアプリケーションにログインしようとすると、非常に遅くなり、アプリケーションがハングします。

このコードをモバイルで使用しています。関数の記述方法にメモリリークがあるかどうかを知りたかっただけです。

4

1 に答える 1

3

現時点で関数が存在するかどうかを確認するのと同じ関数で宣言されているため、常に存在しますが、タイムアウト ID であるかどうかを確認する時点で常に存在するためTimeOutObjundefined実際にタイムアウトをクリアすることはありません。

関数の大部分をクロージャでラップすることにより、実際の処理関数のスコープ外をSetInteractivityTimeout宣言できるTimeOutObjため、関数を呼び出すたびにその値が維持されますSetInactivityTimeout

var SetInactivityTimeOut = (function () {
   var TimeOutObj;
   var TimeoutInterval = 10 * 60 * 1000; //Converting to milisecond

   return function() {
     if (TimeOutObj) {
       clearTimeout(TimeOutObj);
     }

     TimeOutObj = setTimeout(function () {
       // open the main page
     }, TimeoutInterval);
   }
 }());
于 2013-01-11T12:35:34.770 に答える