Установить несколько setInterval (s) динамически и сохранить для последующего доступа - PullRequest
0 голосов
/ 04 июля 2018

У меня есть функция, которая работает с setInterval, и она получает переменные из идентификатора нажатой кнопки. Есть лучший способ сделать это без необходимости каждый раз записывать весь блок switch для новой переменной? Можно ли вызвать setInterval динамически для переменной?

Я не знаю, как выразить эту проблему, но что-то подобное возможно? Использовать массив с элементами и вызывать setInterval для элемента внутри массива?

Примерно так:

allitems.wood

, а затем вызвать allitems [item] = setInterval (function () {collect (allitems [item]);}, время);

Вот как я это делаю сейчас, но каждый раз, когда я включаю новый элемент, мне приходится снова писать всю часть дела ...

switch(item){
  case "wood":
    getwood = setInterval( function() { gather(item); }, time );
    break;
  case "planks":
    makeplanks = setInterval( function() { gather(item); }, time );
    break;
  case "stone":
    getstone = setInterval( function() { gather(item); }, time );
    break;
  case "leather":
    getleather = setInterval( function() { gather(item); }, time );
    break;
  case "iron":
    getiron = setInterval( function() { gather(item); }, time );
    break;
}

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Похоже, вы хотите использовать объект, если я правильно понимаю ваш вопрос.

Примерно так:

allitems.wood

и затем вызовите все элементы [item] = setInterval (function () { (собрать allitems [пункт]); }, время);

Вы можете достичь этого, используя такой объект:

var allitems = {};
allitems[item] = setInterval( function() { gather(item); }, time );

Так что, если ваш предмет «деревянный», то вы можете получить доступ к «деревянному» интервалу, выполнив следующие действия:

allitems.wood или allitems["wood"]

0 голосов
/ 04 июля 2018

Это то, что вам нужно. key - это item, а value - это идентификатор интервала, который можно использовать для последующего удаления интервала, если это необходимо.

var intervals = {};
function addItem()
{
    var item = document.getElementById("item").value;
    var time = document.getElementById("time").value;
    intervals[item] = setInterval(function(){console.log(item)},time);
    console.log(intervals);
}
<input id="item" placeholder="Item">
<input id="time" placeholder="Time">
<button onclick="addItem()">Add</button>
0 голосов
/ 04 июля 2018

Ваше предлагаемое решение в значительной степени правильно. Вы можете использовать скобочные обозначения для доступа к свойствам объекта, поэтому вы можете использовать переменную для динамического доступа к ним.

Следующий код соберет дрова на 6 секунд, остановит их, а затем начнет собирать камень (исключительно для примера).

var allItems = {
    wood: 0,
    planks: 0,
    stone: 0
};

var time = 2000;
   
function getItem(item) {
    allItems[item] = setInterval(function() {
        gather(item);
    }, time);
}

function gather(item) {
    console.log("gathering " + item);
}

getItem("wood");

setTimeout(function() {
    clearInterval(allItems.wood);
    getItem("stone");
}, 6000);
...