-->

停球动态生成的setInterval(stopping dynamically generated

2019-10-18 03:21发布

我生成多个图表,每一个都有自己的setInterval刷新数据。 我有它设置给clearInterval时动态生成的容器被删除 - 但如果我重新加载,它有老的setInterval继续运行相同的ID。 有没有一种方法来设置一个动态命名的setInterval生成置换时,可以停止?

现在,我使用:

function generateChart(data, location){
    var chart = new Highcharts.Chart({
        // blah blah blah
    }, function(chart){
        setInterval(function(){
            if($('#'+location).length){
                // I'm doing stuff every minute
            }else{
                clearInterval();
            }
        },60000);
    });
}

所发生的是,该位置是随机生成的字符串成为用于对Highchart容器中的元素ID并且如果它们用户保存图表变得唯一标识符。 如果用户更新中保存的和重新加载图表的图表,旧的被.removed(),并在其位置产生新的。 现在,新的人有相同的元素ID为旧之一,自旧区间找到容器,它希望它会尝试继续更新 - 这是不能因为它的图表就噗。

有没有一种方法来设置一个动态变量,我可以使用的setInterval,这样我可以在它clearInterval?

var blob+location = setInterval(function(){ ...

接着

clearInterval(blob+location);

Answer 1:

你可以只使用一个对象:

var myObj = {};

var location = "somevalue";

myObj[location] = setInterval(...

clearInterval(myObj[location]);


Answer 2:

行 - 因为我似乎无法环绕一些你的答案我的头,我决定走技术含量低。

function genToken(){
    var num = Math.floor(Math.random() * 10000);
    var token = 't-' + num;
    return token;
}

function genLocation(){
    var chartToken = genToken();
    var newChart = '<div id="'+location+'" data-token="'+chartToken+'"></div>';
    $('#chartHome').append(newChart);
}

// inside my chart function

var token = $('#'+location).data('token');
setInterval(function(){
    if( $('[data-token="'+token+'"]').length ){
        // still there - keep going
    }else{
        // all gone - time to stop
        clearInterval();
    }
},60000);

现在,当我做:

$('#'+location).remove();

令牌也消失,不会是相同的,如果我生成相同的位置ID的新图。



Answer 3:

停止使用setInterval的,使用的setTimeout,而不是( 我如何执行一段代码,不超过每X分钟? ):

function generateChart(data, location) {

    var element = $('#'+location);

    var chart = new Highcharts.Chart({
        // blah blah blah
    }, foo);

    var foo = function() {

        if(element){

            // I'm doing stuff every minute

            setTimeout(foo, 6000);
        }

    };

}

要停止它,只是避免的setTimeout或使element = null

也许我的代码是有点不对(我越来越觉现在),但事情是使用setTimeout和关闭。

如果里面FOO,渴望的东西6秒以上,你会在烦恼,因为setTimeinterval将再次调用它,请观看http://www.youtube.com/watch?feature=player_detailpage&v=i_qE1iAmjFg#t=462s ,因此,这种方式你保证,这将最后完成的东西后运行6秒。

我会在这里让这个例子给后人:

http://jsfiddle.net/coma/vECyv/2/

var closure = function(id) {

    var n = 0;
    var go = true;

    $('#' + id).one('click', function(event) {

        go = false;

    });

    var foo = function() {

        if(go) {

            console.log(id, n++);
            setTimeout(foo, 1000);

        }

    };

    foo();
};

closure('a');
closure('b');


文章来源: stopping dynamically generated setInterval