清除Javascript间隔

时间:2017-02-12 10:52:51

标签: javascript ajax http oop

我正在对文件运行HTTP请求,并根据响应是否为“200”或其他响应运行成功或错误函数。该请求每秒发生一次。

我遇到的问题是,当我收到很多错误响应时,它们一起运行,最后一个不会停止,例如结束间隔以开始新的。

红灯开始闪烁太快。谁能帮我吗。我的代码在下面,我已经玩了几个小时了,但似乎无法深入了解它。

var requestResponses = {

    greenLight: $('.cp_trafficLight_Light--greenDimmed'),
    redLight: $('.cp_trafficLight_Light--redDimmed'),
    greenBright: 'cp_trafficLight_Light--greenBright',
    redBright: 'cp_trafficLight_Light--redBright',

    init: function (url) {
        setInterval(function () {
            requestResponses.getResponse(url);
        }, 1000);
    },

    successResponse: function () {
        var redBright = requestResponses.redBright,
            greenBright = requestResponses.greenBright;
        requestResponses.errorCode = false;
        requestResponses.redLight.removeClass(redBright);
        requestResponses.greenLight.addClass(greenBright);
    },

    errorResponse: function () {
        requestResponses.runOnInterval();
    },

    runOnInterval: function () {
        // clearInterval(runInterval);
        var redBright = requestResponses.redBright,
            greenBright = requestResponses.greenBright,
            redLight = requestResponses.redLight;
        requestResponses.greenLight.removeClass(greenBright);
        var runInterval = setInterval(function () {
            if (requestResponses.errorCode === true) {
                redLight.toggleClass(redBright);
            }
        }, 400);
    },

    getResponse: function (serverURL) {
        $.ajax(serverURL, {
            success: function () {
                requestResponses.errorCode = false;
                requestResponses.successResponse();
            },
            error: function () {
                requestResponses.errorCode = true;
                requestResponses.errorResponse();
            },
        });
    },

    errorCode: false
}

requestResponses.init('/status');

感谢帮助。

2 个答案:

答案 0 :(得分:0)

setInterval()方法一遍又一遍地重复,而不仅仅是一次。然后,您的错误响应处理程序将调用创建另一个setInterval()的例程,依此类推。在你运行这么多进程之前,你会遇到闪烁的红灯问题。

解决方案是仅调用setInterval()调用一次的逻辑。或者,更好的是,使用setTimeout()来调用例程。它运行一次,可能更适合您的使用。

答案 1 :(得分:0)

Javascript是一种事件驱动语言。不要无限循环以定期检查事物。有些地方可以这样做,但大多数时候要么在需要时重复调用延迟函数(setTimeout),要么使用回调将是更好的方法。

将setInterval与请求一起使用时,请考虑如果请求的开始时间超过您的间隔时会发生什么。

在您的情况下,您有两个使用setInterval创建的循环。第一个是每1秒运行一次的请求。您可以修改代码以仅在请求完成后运行setTimeout,并在重新运行下一个请求之前执行其他任务,而不是使用setInterval:

function runRequest(...) {
    $.ajax(serverURL, { 
       ...
       complete: function () {
           setTimeout(runRequest, 1000);
       }
       ...
    });
}

function lightsOnOff() {

    var redBright = requestResponses.redBright,
        greenBright = requestResponses.greenBright,
        redLight = requestResponses.redLight;

    requestResponses.greenLight.removeClass(greenBright);
    if (requestResponses.errorCode === true) {
        redLight.toggleClass(redBright);
    }

}
setInterval(lightsOnOff, 400);