Использование атрибута requireJS и defer все еще получает сообщение об ошибке: Ошибка скрипта для & ldquo; NativeUIAPI & rdquo ;, необходимая: main [duplicate]

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

4
задан Louis 16 May 2014 в 17:27
поделиться

1 ответ

То, что вы делаете , не может работать надежно , потому что вы загружаете конфигурацию RequireJS асинхронно и , у вас есть синхронный код, который зависит от этой конфигурации.

Вот что происходит:

  1. Эта строка:
    <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 загружен еще асинхронно, независимо от того, что.
  2. Когда это выполняется:
    <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.

8
ответ дан Louis 24 August 2018 в 18:49
поделиться
Другие вопросы по тегам:

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