Использование if / else, если функция выполняет разные действия в зависимости от опции, выбранной внутри выбранного

Вы можете обойти это, либо используя java.util.concurrent.ThreadPoolExecutor, либо вручную, имея поток, который вызывает Runnable.run() для каждого Runnable, который ему задан, а не фактически выходит, когда он закончен.

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

public class ReusableThread extends Thread {
    private Queue<Runnable> runnables = new LinkedList<Runnable>();
    private boolean running;

    public void run() {
        running = true;
        while (running) {
            Runnable r;
            try {
                synchronized (runnables) {
                    while (runnables.isEmpty()) runnables.wait();
                    r = runnables.poll();
                }
            }
            catch (InterruptedException ie) {
                // Ignore it
            }

            if (r != null) {
                r.run();
            }
        }
    }

    public void stopProcessing() {
        running = false;
        synchronized (runnables) {
            runnables.notify();
        }
    }

    public void addTask(Runnable r) {
        synchronized (runnables) {
            runnables.add(r);
            runnables.notify();
        }
    }
}

Очевидно, это просто пример. Он должен иметь лучший код обработки ошибок и, возможно, больше настроек.

0
задан Lapahn 13 July 2018 в 08:33
поделиться

5 ответов

Проблема в том, что вы не проверяете значение selected. Я хотел бы предложить использовать переключатель вместо того, чтобы здесь выглядеть следующим образом.

$("#classFilter").change(function () {
  switch(this.value) {
    case "0" : console.log(this.value); break;
    case "1" : console.log(this.value); break;
    case "2" : console.log(this.value); break;
    case "3" : console.log(this.value); break;
    case "4" : console.log(this.value); break;
    case "5" : console.log(this.value); break;
    case "6" : console.log(this.value); break;
    case "7" : console.log(this.value); break;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="controls">
    <select id="classFilter">
        <option value="0" selected>All</option>
        <option value="1">Scion</option>
        <option value="2">Marauder</option>
        <option value="3">Ranger</option>
        <option value="4">Witch</option>
        <option value="5">Duelist</option>
        <option value="6">Templar</option>
        <option value="7">Shadow</option>
    </select>
</div>

2
ответ дан Nikhil Aggarwal 17 August 2018 в 13:29
поделиться
  • 1
    Спасибо, это работает! Вы знаете, как я могу вызвать функцию внутри случаев? Когда я пытаюсь позвонить, он ничего не делает. – Lapahn 13 July 2018 в 08:17
  • 2
    @Lapahn - Можете ли вы поделиться своими усилиями, и я могу помочь вам в этом. Также обратите внимание, что console.log - это функция, которая здесь называется. Просто добавьте оператор любой функции перед операцией break для случая, и это должно работать. – Nikhil Aggarwal 13 July 2018 в 08:31
  • 3
    Я добавил вопрос и код внизу. Я пытаюсь вызвать функцию внутри дел. Позже я хочу иметь функцию, которая показывает мне только определенные классы из игры. Поэтому, когда я выбираю «Рейнджер», он должен показывать только Рейнджерс и т. д. – Lapahn 13 July 2018 в 08:35
  • 4
    @Lapahn. В функции вы привязываете событие click к элементу. Можете ли вы добавить свой html. Кроме того, попробуйте добавить несколько журналов в свою функцию и увидеть проблему. – Nikhil Aggarwal 13 July 2018 в 08:51

Вы можете прочитать значение поля выбора, а затем сравнить его, если блок else else. См. Ниже код

$("#classFilter").change(function () {
        var value = $(this).val();
        if(value=="0") {
        console.log(value);
       } else if(value=="0") {
        console.log(value);
       } else if(value=="1") {
        console.log(value);
       } else if(value=="2") {
        console.log(value);
       } else if(value=="3") {
        console.log(value);
       } else if(value=="4") {
        console.log(value);
       } else if(value=="5") {
        console.log(value);
       } else if(value=="6") {
        console.log(value);
       } else if(value=="7") {
        console.log(value);
       }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="controls">
    <select id="classFilter">
        <option value="0" selected>All</option>
        <option value="1">Scion</option>
        <option value="2">Marauder</option>
        <option value="3">Ranger</option>
        <option value="4">Witch</option>
        <option value="5">Duelist</option>
        <option value="6">Templar</option>
        <option value="7">Shadow</option>
    </select>
</div>

1
ответ дан Bhushan Kawadkar 17 August 2018 в 13:29
поделиться

Если вы собираетесь идти по этому маршруту, вам также нужно проверить, что опция с указанным значением равна :selected, а длина коллекции не равна 0:

$("#classFilter").change(function () {
    if ($('#classFilter option[value="0"]:selected').length !== 0) {
        console.log('option 0');
        console.log(this.value);
    }

    else if ($('#classFilter option[value="1"]:selected').length !== 0) {
        console.log('option 1');
        console.log(this.value);
    }

    else if ($('#classFilter option[value="2"]:selected').length !== 0) {
        console.log('option 2');
        console.log(this.value);
    }

    else if ($('#classFilter option[value="3"]:selected').length !== 0) {
        console.log(this.value);
    }

    else if ($('#classFilter option[value="4"]:selected').length !== 0) {
        console.log(this.value);
    }

    else if ($('#classFilter option[value="5"]:selected').length !== 0) {
        console.log(this.value);
    }

    else if ($('#classFilter option[value="6"]:selected').length !== 0) {
        console.log(this.value);
    }

    else if ($('#classFilter option[value="7"]:selected').length !== 0) {
        console.log(this.value);
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="controls">
    <select id="classFilter">
        <option value="0" selected>All</option>
        <option value="1">Scion</option>
        <option value="2">Marauder</option>
        <option value="3">Ranger</option>
        <option value="4">Witch</option>
        <option value="5">Duelist</option>
        <option value="6">Templar</option>
        <option value="7">Shadow</option>
    </select>
</div>

Но вам может быть проще использовать объект (индексированный по значению) функций:

const optionFns = {
  0: () => console.log('default option!'),
  1: () => console.log('you chose value 1!'),
  2: () => console.log('Marauder!'),
  3: () => console.log('Ranger...'),
}

$("#classFilter").change(function () {
  const value = $('#classFilter option:selected').val();
  optionFns[value]();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="controls">
    <select id="classFilter">
        <option value="0" selected>All</option>
        <option value="1">Scion</option>
        <option value="2">Marauder</option>
        <option value="3">Ranger</option>
        <option value="4">Witch</option>
        <option value="5">Duelist</option>
        <option value="6">Templar</option>
        <option value="7">Shadow</option>
    </select>
</div>

2
ответ дан CertainPerformance 17 August 2018 в 13:29
поделиться
  • 1
    Я думаю, вы хотите использовать is(":selected") или получить доступ .length. jQuery() всегда возвращает объект, даже если селектор не соответствует, а объекты всегда правдивы – Patrick Evans 13 July 2018 в 07:17
  • 2
    Код все еще прыгает внутри первого оператора if, а затем выпрыгивает независимо от того, какой вариант я выбираю. – Lapahn 13 July 2018 в 07:20
  • 3
    Также вы можете получить значение элемента select непосредственно $('#classFilter').val() op, только что совершила ту же ошибку, которую вы сделали и протестировали против объекта. – Patrick Evans 13 July 2018 в 07:22
  • 4
    @Lapahn См. Edit, вам также нужно проверить length коллекции, если вы делаете такую ​​повторяющуюся if / else вещь (но я бы предпочел использовать объект функций, ключи которых соответствуют значениям опций, как и во втором коде) – CertainPerformance 13 July 2018 в 07:22
  • 5
    @CertainPerformance спасибо, что работает! Как мне пойти с вызовом функции внутри const? Например, 3: () => hardcoreTop100() – Lapahn 13 July 2018 в 08:29

Я думаю, проблема связана с выбранным атрибутом, который вы использовали внутри тега опции.

<select id="classFilter">
   <option value="0"  selected="selected">All</option>
   <option value="1">Scion</option>
   <option value="2">Marauder</option>
   <option value="3">Ranger</option>
   <option value="4">Witch</option>
   <option value="5">Duelist</option>
   <option value="6">Templar</option>
   <option value="7">Shadow</option>
</select>

Для получения дополнительной информации следуйте этой ссылке .

будет работать для вашей функции JavaScript.

$("select#classFilter").on('change', function(e){
   console.log($("select#classFilter").val());
});
1
ответ дан drox2014 17 August 2018 в 13:29
поделиться

// We can get the selected value from the select itsself, not the options.
const selected_class = $("#classSelection").val();
// A function we want to use differently depending on what was selected.
const create_class = function( attr_str, attr_con, attr_int ) {
  // create a new character with these stats.
  return 'creating new class with stats: ' + attr_str + '|' + attr_con + '|' + attr_int;
};
// Might as well use an object to store the function calls instead of a list of if/else statements. It's easier to add extra options this way.
const class_functions = {
  all: function() {
    // create one of each class
  },
  duelist: function() {
    return create_class( 18, 14, 8 );
  },
  marauder: function() {
    return create_class( 20, 16, 4 );
  },
  ranger: function() {
    return create_class( 14, 14, 12 );
  },
  scion: function() {
    return create_class( 12, 20, 10 );
  },
  shadow: function() {
    return create_class( 12, 12, 16 );
  },
  templar: function() {
    return create_class( 16, 12, 14 );
  },
  witch: function() {
    return create_class( 8, 8, 20 );
  }
};
// Create the selected class. Scion is selected in the dropdown.
const character = class_functions[ selected_class ]();
console.log( character );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="classSelection">
  <option value="all">All</option>
  <option value="scion" selected>Scion</option>
  <option value="marauder">Marauder</option>
  <option value="ranger">Ranger</option>
  <option value="witch">Witch</option>
  <option value="duelist">Duelist</option>
  <option value="templar">Templar</option>
  <option value="shadow">Shadow</option>
</select>

1
ответ дан Shilly 17 August 2018 в 13:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: