0

私は小さなチャットをしています:)

ユーザーが入力している (または入力を停止した) 場合、これは他のユーザーに通知され、ユーザーが入力するかどうかを切り替えた場合にのみ (テキストエリアが空かどうかを確認する)

今、私はこれらの信号が次々と急速に送信されるのを防ぎたい.. settimeout でそれを行うことができると考えていますが、コードのどこにどのように配置すればよいかわかりません:

var istyping = false;
var wastyping = false;

chatfield.keyup(function(e) {
    if (e.keyCode != 13) {

        function typesignal(state) {
            channel.send(JSON.stringify({
                username: username,
                type: 'typing',
                message: state
            }));
        }

        if (chatfield.val()) {

            istyping = true;

                if (wastyping==false) {
                    typesignal(1);
                    wastyping = true;
                }

        } else {

            istyping = false;

                if (wastyping==true) {
                    typesignal(0);
                    wastyping = false;
                }

        }
    }
});
4

2 に答える 2

1

これを「スロットリング」と呼ぶかもしれませんが、キーストロークごとにサーバーを強制終了しないように、オートコンプリート ドロップダウンなどで多く使用しています。JS 標準ライブラリを使用すると、タイムアウトをクリアできます。また、setTimeout が呼び出されたときに ID を返します。したがって、関数が一定時間内に再度呼び出された場合、この ID を使用してタイムアウトをクリアする (時間内にコールバックが呼び出されないようにする) ことができます。たとえば、次のようになります。

var timeId;

function throttle(callback, ms) {
    if (timeId) {
      clearTimeout(timeId);
    }

    timeId = setTimeout(callback, ms)
}

chatfield.keyup(function(e) {
  throttle(your_fn, 500);
});

明確でない場合、setTimeout は、2 番目のパラメーターとしてミリ秒単位で指定された一定時間後に関数を実行します。したがって、setTimeout(function(){},300) を呼び出すと、その関数は 300 ミリ秒後に呼び出されます。また、元のリクエストを「キャンセル」することもできます。したがって、最初のリクエストが実行される前に別のリクエストを受け取った場合は、キャンセルして最初からやり直してください。それが私が上で説明しようとしていたパターンです:-)

于 2012-05-11T02:36:17.307 に答える
-1

私はこれをするだろう

chatfield.keyup(function(e) {
    if (e.keyCode != 13) {

        function typesignal(state) {
            channel.send(JSON.stringify({
                username: username,
                type: 'typing',
                message: state
            }));
        }

        if (chatfield.val()) {

            istyping = true;

                if (wastyping==false) {
                    typesignal(1);
                    wastyping = true;
                }

        } else {

            istyping = false;

                if (wastyping==true) {
                    typesignal(0);
                    wastyping = false;
                }

        }
    }
function doNothing() { 
}
setTimeout("doNothing()",1000);
});
于 2012-05-11T01:44:53.143 に答える