1

丸一日経ちましたが、まだこの問題を解決できないようです。

私は自分の Web サイトのプロジェクトに取り組んでいますが、間隔内で IF ステートメントから間隔タイマーを変更する方法を知る必要があります。

間隔は、$.post からのエラーがあるかどうかをチェックし、ある場合は最初のシステム エラーを表示します。(エラー#2に進むために別の変数をインクリメントするだけでなく.

3 秒後、エラー #2 が表示されます。それがまさに私が望む方法です。しかし、間隔は3秒のままで、何をしても機能しません。

_staffIntervalID = 3000;
serverError = 0;

staffMsg = setInterval(function() { 

        if(isInChat == true) {
        $.post('./slivechat.php', {staff:"true"}, function(data) {
        if(data == "") return;

        $('#display_msg').append( + nl2br(data) + "<br />");
        $('#display_msg').animate({scrollTop: $(document).height()}, 'slow');

        })
                .error(function() {
                 serverError++;

                if(serverError == 1) {
                $('#display_msg').append("<span style='color: red;'>System</span>: An error occured whilst we tried to fetch staff response. Please wait while I try to fix the this problem.<br />");
                _staffIntervalID = 12000;
                } else if(serverError == 2) {
                $('#display_msg').append("<span style='color: red;'>System</span>: There seems to be an error, please check your conection. Or wait a few more seconds for the final verdict.<br />");
                _staffIntervalID = 24000;
                } else if(serverError >= 3) { 
                $('#display_msg').append("<span style='color: red;'>System</span>: Due to technical difficulties we are closing this chat. Please try again later! <br />");
                clearInterval(staffMsg);
                }

        $('#display_msg').animate({scrollTop: $(document).height()}, 'slow');
        console.log("ServerError: " + serverError + " timer: " + _staffIntervalID);
        });
        }

    }, _staffIntervalID); 

console.log でも、タイマーが変更されたことが示されていますが、3 ごとに更新され続けています。

これをすぐに修正できることを本当に願っています!

Ps- Javascript は私のメイン言語ではなく、PHP です。修正がある場合は、例も挙げてみてください。

4

4 に答える 4

2

いいえ、間隔を変更することはできません。

ただし、代わりに次の方法で行うことができます。

var _staffIntervalID = 3000;
setTimeout(function() {
    // your code here
    setTimeout(arguments.callee,_staffIntervalID);
},_staffIntervalID);
于 2013-08-06T14:00:21.013 に答える
1

匿名関数を使用せず、タイマーをリセットすることをお勧めします

serverError = 0;

var staffMsg = setInterval(CheckError, 3000);
function CheckError () {

    if (isInChat == true) {
        $.post('./slivechat.php', {
            staff: "true"
        }, function (data) {
            if (data == "") return;

            $('#display_msg').append(+nl2br(data) + "<br />");
            $('#display_msg').animate({
                scrollTop: $(document).height()
            }, 'slow');

        })
            .error(function () {
            serverError++;

            if (serverError == 1) {
                $('#display_msg').append("<span style='color: red;'>System</span>: An error occured whilst we tried to fetch staff response. Please wait while I try to fix the this problem.<br />");
                clearTimeout(staffMsg);
                staffMsg = setInterval(CheckError, 12000);
            } else if (serverError == 2) {
                $('#display_msg').append("<span style='color: red;'>System</span>: There seems to be an error, please check your conection. Or wait a few more seconds for the final verdict.<br />");
                clearTimeout(staffMsg);
                staffMsg = setInterval(CheckError, 24000);
            } else if (serverError >= 3) {
                $('#display_msg').append("<span style='color: red;'>System</span>: Due to technical difficulties we are closing this chat. Please try again later! <br />");
                clearInterval(staffMsg);
            }

            $('#display_msg').animate({
                scrollTop: $(document).height()
            }, 'slow');
            console.log("ServerError: " + serverError + " timer: " + _staffIntervalID);
        });
    }

}
于 2013-08-06T14:05:21.253 に答える
0

実際には、setInterval メソッドはタイマー値をリセットするだけではタイマー値を変更しません。

あなたがすべきことは、タイマーをクリアし、次のような関数の参照として関数名を使用することです:

var delay = 1000, now = new Date().valueOf();
var timer = setInterval(function loop()
{
    console.log(now - new Date.valueOf());

    delay += 1000;
    clearInterval(timer);
    timer = setInterval(loop, delay);

}, delay);

または(タイムアウト付き):

var delay = 1000, now = new Date().valueOf();
var timer = setTimeout(function loop()
{
    console.log(now - new Date.valueOf());

    delay += 1000;
    timer = setTimeout(loop, delay);

}, delay);

タイマーに ajax 呼び出しを入れるのは良い考えかもしれないことに注意してください。応答が再度呼び出されるのを待つ必要があります。

于 2013-08-06T14:01:29.693 に答える
0

変数 _staffIntervalID を変更しても、setInterval が変更されるという意味ではありません。それを機能させるには、clearInterval を実行し、新しい値で新しい setInterval を実行する必要があります。

于 2013-08-06T14:02:48.207 に答える