1

これは何ですか

Campfire Chat Serviceには絵文字機能がないため、現在、絵文字のスクリプトを作成しています。現在、チャットに新しいメッセージがあるかどうかを200ミリ秒ごとにチェックすることになっているsetIntervalを使用しているため、絵文字の実行は非常に遅くなっています。これを行うには、で2つの変数「a」と「b」を作成しvar a,b;ます。したがって、最初のsetIntervalで、150ミリ秒の時間を計測します。この中で、変数「a」にチャットのHTMLの値を指定します。次に、2番目のsetInterval(200)で、変数「b」にHTMLの値も指定しますが、これはタイミングが異なるため、HTMLをチェックします。ifステートメントとそれが異なる場合は、シンボルを絵文字に変更する関数を実行します。これはパフォーマンスを向上させるためでした。Campfire Chatの誰も実際に何かを書いていなくても、絵文字をチェックする前に、絵文字をチェックする必要はありません。

これは完全な機能です:

var a, b;
setInterval(function() {
    a = $('#chat').html();
    console.warn("Chat HTML has been Scanned");
}, 150);
var t = "0";
setInterval(function() {
    b = $('#chat').html();
    console.warn("Chat got scanned for Change in html.");
    if (emoOn == true) {
        if (t === $('#num12345').text()) {
            $(".participants").after('<div id="emote"><h3><span class="room_actions"><a href="javascript:void(0)" class="on" style="font-weight:bold;">On</a> | <a href="javascript:void(0)" class="off" style="cursor:pointer;">Off</a></span>Emoticons</h3></div>');
            $('#num12345').text("111")
        }
        if (a !== b) {
            turnOn();
            console.log("CHANGE")
        } else {
            turnOn("off");
        }
    }
}, 200)​;

問題

上記のコードでわかるように、私は3つのコンソールを実行します。コンソールでは、「チャットHTMLがスキャンされました」という警告が表示され、次に「チャットがスキャンされてHTMLの変更が検出されました」という警告が表示されると思います。ずっとその順番で。しかし、代わりに「チャットHTMLがスキャンされました」という警告が2回表示され、私がイメージしたように機能しません。

そして、新しいメッセージが「変更」をログに記録することを想定していることを示しているが、ほとんどの場合、ログに記録されていない場合、それはsetIntervalsの問題だと思います。タイミングが合っていないようです。しかし、JavaScriptがこの問題を引き起こしているとは言いたくありませんが、他に何ができるのかわかりません。また、私はChromeを使用しています。

4

1 に答える 1

1

setIntervalは非同期であるため、最初の呼び出しが待機しているとき、javascriptインタープリターは次のジョブに進みます(この場合、tを「0」に設定してから2番目のsetInterval呼び出し)。

編集:問題は、setInterval呼び出しを同時に定義していることだと思いますが、javascriptタイマーの精度はそれほど高くありません(ここを参照してください:http://ejohn.org/blog/accuracy-of-javascript-時間/)。

setTimeoutの後に2番目のsetIntervalを呼び出して、自分自身に少しのバッファーを与えることができます。

var a, b;
setInterval(function() {
    a = $('#chat').html();
    console.warn("Chat HTML has been Scanned");
    var t = "0";
}, 2000);
setTimeout(function(){
    setInterval(function() {
        b = $('#chat').html();
        console.warn("Chat got scanned for Change in html.");
        if (emoOn == true) {
            if (t === $('#num12345').text()) {
                $(".participants").after('<div id="emote"><h3><span class="room_actions"><a href="javascript:void(0)" class="on" style="font-weight:bold;">On</a> | <a href="javascript:void(0)" class="off" style="cursor:pointer;">Off</a></span>Emoticons</h3></div>');
                $('#num12345').text("111")
            }
            if (a !== b) {
                turnOn();
                console.log("CHANGE")
            } else {
                turnOn("off");
            }
        }
    }, 2000)​;

}, 500);

これにより、最初の呼び出しの0.5秒後にsetIntervalへの2番目の呼び出しが設定されますが、それよりもはるかに少ない時間で逃げることができます(30msを超えるもので十分です)。

于 2012-06-10T01:39:13.443 に答える