Array.pop()没有杀死我的setInterval

时间:2017-04-23 23:43:33

标签: javascript jquery

我写了一些代码,当你点击一个按钮时,它会向一个数组添加一个函数实例,

var objects = [];

$(document).on("click", ".addButton", function(){
    objects.push(new newObject(1));
});

function newObject(amount){
    setInterval(function(){ 
        addValue(amount);
    }, 1000);
}

然后每秒创建的每个新对象每秒都会继续运行addValue函数,增加数量。

问题是当我尝试使用objects.pop()销毁该函数时,它会删除该对象,但setInterval不会停止运行。

如何使其破坏该功能中的所有内容并阻止其运行?

2 个答案:

答案 0 :(得分:4)

JS中的setInterval没有类似的东西。我建议声明一种处理清理的方法。

// "Class" declaration    
function newObject(amount) {
    var id = setInterval(function() { 
        addValue(amount);
    }, 1000);

    this.kill = function() {
        clearInterval(id);
    }
}


// "Public" api for the data structure
var objects = [];

function addNewObject() {
    objects.push(new newObject(1));
}

function destroyLastObject() {
    objects.pop().kill();
}

// Event bindings
$(document).on("click", ".addButton", addNewObject);
$(document).on("click", ".removeButton", destroyLastObject);

完全未经测试,但沿着这些方针应该有效。

修改

这个,imo,是学习javascript中不同模式的一个很好的资源 - 很长但非常值得阅读:https://addyosmani.com/resources/essentialjsdesignpatterns/book/

答案 1 :(得分:0)

你必须找到要检查的东西以清除间隔。我正在根据数组长度清除。它只执行一次。



// you got to find something to check against to clear the interval
var objects = [];

document.addEventListener("click", function(){
  console.log('click');
    objects.push(new newObject(1));
});

function newObject(amount){
 
 var interval= setInterval(function(){ 
     
         if(objects.length !==0){
        clearInterval(interval);
        }
    }, 1000);
}