Java для каждого цикла (ака расширенный для цикла) является упрощенной версией цикла for. Преимущество состоит в том, что для записи меньше кода и меньше переменных для управления. Недостатком является то, что вы не контролируете значение шага и не имеете доступа к индексу цикла внутри тела цикла.
Они лучше всего используются, когда значение шага является простым шагом в 1, и когда вам нужно только доступ к текущему элементу цикла. Например, если вам нужно циклически перебирать каждый элемент в массиве или коллекции, не заглядывая вперед или за текущий элемент.
Нет инициализации цикла, нет логического условия, а значение шага неявно и является простое приращение. Вот почему они считаются намного проще, чем регулярные для петель.
Усовершенствованные для циклов следуют этому порядку выполнения:
1) тело цикла
2) повторить с шага 1 до тех пор, пока не пройден весь массив или коллекция
Пример - массив целых чисел
int [] intArray = {1, 3, 5, 7, 9};
for(int currentValue : intArray) {
System.out.println(currentValue);
}
В переменной currentValue текущее значение зацикливается в массиве intArray. Обратите внимание, что нет явного значения шага - это всегда инкремент на 1.
Двоеточие можно считать означающим «in». Таким образом, расширенное объявление цикла содержит: loop over intArray и сохраняет текущее значение int массива в переменной currentValue.
Выход:
1
3
5
7
9
Пример - String Array
Мы можем использовать цикл for-each для итерации по массиву строк. Объявление цикла указывает: loop over myStrings Строковый массив и сохранить текущее значение String в переменной currentString.
String [] myStrings = {
"alpha",
"beta",
"gamma",
"delta"
};
for(String currentString : myStrings) {
System.out.println(currentString);
}
Выход:
alpha
beta
gamma
delta
Пример - Список
Улучшенный цикл for также можно использовать для итерации по java.util.List следующим образом:
List myList = new ArrayList();
myList.add("alpha");
myList.add("beta");
myList.add("gamma");
myList.add("delta");
for(String currentItem : myList) {
System.out.println(currentItem);
}
Объявление цикла: loop over myList List of Strings и сохранение текущего значения List в переменной currentItem.
Вывод:
alpha
beta
gamma
delta
Пример - Установить
Улучшенный цикл for также можно использовать для итерации по java.util. Установите следующее:
Set mySet = new HashSet();
mySet.add("alpha");
mySet.add("alpha");
mySet.add("beta");
mySet.add("gamma");
mySet.add("gamma");
mySet.add("delta");
for(String currentItem : mySet) {
System.out.println(currentItem);
}
В объявлении цикла указано: loop over mySet Set Strings и сохранить текущее значение Set в переменной currentItem. Обратите внимание, что, поскольку это Set, дублирующиеся значения String не сохраняются.
Выход:
alpha
delta
beta
gamma
Источник: Петли в Java - Руководство по Ultimate
То, что вы делаете , не может работать надежно , потому что вы загружаете конфигурацию RequireJS асинхронно и , у вас есть синхронный код, который зависит от этой конфигурации.
Вот что происходит:
<script src="/js/shop2/springen/vendor/require.min.js" data-main="/js/shop2/springen/app" async></script>
вызывает загрузку RequireJS и вызывает требование RequireJS для планирования асинхронной загрузки для вашего /js/shop2/springen/app
. Атрибут async
этого элемента также делает его так, что браузер имеет право загружать RequireJS асинхронно. Если он загружает RequireJS асинхронно, это связывает проблему, с которой вы столкнулись, поскольку к моменту запуска вашего другого элемента <script>
не сообщается, загружается ли RequireJS. Он может загружаться или не загружаться в зависимости от множества внешних факторов. Это сводится к удаче. Однако удаление этого не является целым решением, потому что запрошенный вами модуль через data-main
загружен еще асинхронно, независимо от того, что. <script type="text/javascript">
$(document).ready(function(){
require(['Search'], function () {
...
});
});
</script>
не указано, загружен ли ваш основной модуль или нет, потому что (см. Выше) он загружается асинхронно. Поэтому RequireJS действительно может быть загружен , но он, возможно, еще не настроен , потому что ваша конфигурация находится в модуле, который может быть загружен или не может быть загружен к тому моменту, когда этот скрипт запустить. Вот почему typeof require
будет функцией, но вы получите ошибки, пытаясь загрузить модули, зависящие от вашей конфигурации. $(document).ready
не помогает, потому что событие, которое вызывает $(document).ready
, может произойти до того, как RequireJS загрузил основной модуль. Если вы не можете поместить код require(['Search']...
в свой основной модуль , что вы можете сделать, это удалить вызов requirejs.config
из /js/shop2/springen/app
, а затем добавить элемент <script>
непосредственно перед тем, который загружает RequireJS, который делает:
require = {
baseUrl: '/js/shop2/springen/',
paths: {
'lodash': 'vendor/lodash.min',
...
}
});
Установка параметра require
variable до конфигурации перед загрузкой RequireJS говорит RequireJS использовать значение этой переменной в качестве своей конфигурации.
И не забудьте удалить этот атрибут async
из <script>
который загружает RequireJS.