6

UIに時計を備えたDojoを使用してアプリケーションを作成しました。ただし、アプリケーションUIがハングアップし、時計が停止することがあります。時計がJavaScriptコードによって駆動されているため、JSエンジンが停止したと推測します。

次のコードがメモリリークを引き起こし、その後ハングアップの問題を引き起こすかどうかわからない。再帰的にsetTimeoutinvokeを使用して、クロックを実装しています。

dojo.declare("xxx.xxx.HomepageHeader", [dijit._Widget, dijit._Templated],
{
widgetsInTemplate: true,
_time :'',
dateUtil: null,

// ....
// ....

prefix :function (value, p)
{
    return (value < 10) ? p + value : value;
},

updateTime :function ()
{
    var d = new Date();
    var _this = this;
    var t = [_this.prefix(d.getHours(), '0'), _this.prefix(d.getMinutes(), '0'), _this.prefix(d.getSeconds(), '0')].join(':');
    _this._time.innerHTML = t;
    _this.dateInfo.innerHTML = this.dateUtil.format(d, "yyyy/MM/dd") + " &nbsp;|&nbsp " + this.dateUtil.format(d, "EEE");
    window.setTimeout( function(){_this.updateTime();}, 100);
}

// ....
// ....
}

クラス内で、メソッドupdateTimeがwindow.setTimeoutを使用して再帰的に呼び出し、UIの時間テキストを更新していることに注意してください。

ここにメモリリークの問題はありますか?答えが「いいえ」の場合、ハングアップの問題を引き起こした可能性のある問題はありますか?

ありがとう!

4

1 に答える 1

2

これは実際には再帰ではありません。これは、次の呼び出しを将来のある時点でsetTimeout()スケジュールし、その後、現在の呼び出しが実際に完了するためです。したがって、スタックフレームの蓄積はなく、したがって実際には再帰ではありません。また、ここではメモリリークの理由はわかりません。updateTime()updateTime()

使用しているスキームは問題なく、頻繁に使用されますが、ブラウザで実行される他の処理のためにより多くのCPUサイクルを残すために、100ミリ秒ごとよりも少ない頻度で実行することをお勧めします。

クロックが停止している場合は、JSエンジンがスタックしているかループしていることが原因ですが、実際のクロックコード以外の場所のコードでスタックしている可能性があります。

于 2012-08-31T05:21:21.727 に答える