Я написал некоторый код, который при нажатии кнопки добавляет экземпляр функции в массив,

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
Steve 24 Апр 2017 в 02:43

2 ответа

Лучший ответ

В 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/

4
Chris 24 Апр 2017 в 00:00

Вы должны найти что-то для проверки, чтобы очистить интервал. Я очищаю на основе длины массива. Он выполняется только один раз.

// 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);
}
0
Rick 24 Апр 2017 в 00:45
43577718