onload in for loop возвращает только последний элемент (JS) [дубликат]

Ну, во-первых, вы теряете память с помощью нового HashMap вызова создания. Ваша вторая строка полностью игнорирует ссылку на этот созданный хэш, что делает ее доступной сборщику мусора. Итак, не делайте этого, используйте:

  private Map & lt; String, String & gt;  someMap = (HashMap & lt; String, String & gt;) getApplicationContext (). getBean ("someMap");   

Во-вторых, компилятор жалуется, что вы передали объект в HashMap , не проверяя, является ли это HashMap . Но даже если вы должны были сделать:

  if (getApplicationContext (). GetBean ("someMap") instanceof HashMap) {private Map & lt; String, String & gt;  someMap = (HashMap & lt; String, String & gt;) getApplicationContext (). getBean ("someMap");  }  

Возможно, вы все равно получите это предупреждение. Проблема в том, что getBean возвращает Object , поэтому неизвестно, что это за тип. Преобразование его в HashMap напрямую не вызовет проблемы со вторым случаем (и, возможно, в первом случае не было бы предупреждения, я не уверен, как педантичный компилятор Java с предупреждениями для Java 5). Тем не менее, вы преобразовываете его в HashMap & lt; String, String & gt; .

HashMaps - это действительно карты, которые берут объект в качестве ключа и имеют объект как значение, HashMap & lt; Object, Object & gt; , если хотите. Таким образом, нет никакой гарантии, что когда вы получите свой bean-компонент, он может быть представлен как HashMap & lt; String, String & gt; , потому что вы могли бы иметь HashMap & lt; Date, Calendar & gt; , потому что возвращаемое не общее представление может иметь любые объекты.

Если код компилируется, и вы можете выполнить String value = map.get («thisString»); без каких-либо ошибки, не беспокойтесь об этом предупреждении. Но если карта не полностью содержит строковые ключи для строковых значений, во время выполнения вы получите ClassCastException , потому что генерики не могут заблокировать это в этом случае.

2
задан Denys Séguret 3 July 2014 в 14:30
поделиться

1 ответ

Проблема заключается в том, что ваш обратный вызов вызывается, когда цикл завершен, поэтому value изменился.

Решение состоит в том, чтобы использовать закрытие для хранения значения value:

for (var value in CourseTitleArray) {
     (function(value){
               console.log( "Course Title " + CourseTitleArray[value]);
               var newImageLocation = path.join(__dirname, 'app/img/courseImages', CourseTitleArray[value] +  ".png");

                  fs.readFile(image.path, function(err, data) {
                      fs.writeFile(newImageLocation, data, function(err) {
                      console.log(CourseTitleArray[value] + " was  created successfully");   

                      });
                  }); 
                console.log("Loop executed " +  value);  
      })(value);
}

Обратите внимание, что непонятно, что вы имеете в виду с вашим журналом «Выполненный цикл»: когда вы регистрируетесь, запись еще не произошла.

5
ответ дан Denys Séguret 15 August 2018 в 15:36
поделиться
  • 1
    Кажется, у него есть синтаксическая ошибка, верно? – Amila Iddamalgoda 1 July 2014 в 09:22
  • 2
    @AmilaIddamalgoda Да, исправил. Но было бы проще, если бы вы правильно отложили свой код для начала. – Denys Séguret 1 July 2014 в 09:24
  • 3
    Да, товарищ !! мой плохой я исправил это уже, и это работает нормально. Большое спасибо за то, что указали причину и дали мне решение. – Amila Iddamalgoda 1 July 2014 в 09:28
Другие вопросы по тегам:

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