Abramov7
@Abramov7

Как вывести массив из функции JavaScript?

Здравствуйте. Случился такой абсурдный момент. У меня есть функция, которая проходит по XML-странице, собирает нужные значения в массив. Пример функции:
function my_func(url){
    $.get(
      // Указываем URL, куда будем делать запрос
      url,
      // Функция в случае успешного выполнения
      function(data){
        // Создаем пустой массив
        var array = new Array();
        // Перебираем полученные данные и заносим в массив
        $('title', data).each(function(){
          // Добавляем значение в массив
          array.push( $(this).text() );
        });
        return array;
      },
      'xml'
    );
  }

Если вместо return array; прописать console.info(array);, то в консоли выведет полученный массив. Но если я буду делать так:
console.info( my_func('http://site.ru/page1.xml') ); // undefined
, то ничего не выводит (undefined).

Мне нужно иметь в одном массиве значения с нескольких XML-страниц, т.е. функция должна проходить по page1.xml, page2.xml, page3.xml.

Подскажите, друзья знатоки, в чем моя ошибка. Поправьте руки. Спасибо.

P.S.
my_func('http://site.ru/page1.xml');
console.info( array ); // undefined
  • Вопрос задан
  • 2443 просмотра
Решения вопроса 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Возвращайте результат в колбэк или используйте промисы
ajax асинхронный, нельзя получить здесь сейчас то, что будет когда-то потом, в неопределенном будущем
Ответ написан
abyrkov
@abyrkov
JavaScripter
А - асихронность.
Упростим ваш код:
function() {
  func(function() {
    var array = new Array();
    return array;
  })
}

Ваш код в третей функции исполняется во второй(которую мы вызываем), в первой ни array, ни return array доступен не будет. Более того, если сделать так:
function() {
  var array = new Array();
  func(function() {
    // Меняем тут array
  });
  return array;
}

Будет возвращать пустой массив!
В чем же дело? Вы отправляете запрос на сервер, а код исполняется дальше. То есть третья функция может быть вызвана в любой момент - когда придет ответ от сервера. Можно использовать сихронный вариант, но это плохая идея.
Решения, как всегда, два: callback и Promise.
Решение с callback:
function(callback) {
  func(function() {
    var array = new Array();
    callback(array);
  })
}
// Использование 
func(function(array) {
  console.log(array);
});

Решение с Promise сложнее и требут знание промисов, собственно говоря. Но в использовании оно проще
function() {
  return new Promise(function(resolve) {
    func(function() {
      var array = new Array();
      resolve(array);
    });
  });
}
// Использование
func().then(function(array) { console.log(array) });

К прочтению о Promises
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Abramov7
@Abramov7 Автор вопроса
Первую ошибку нашёл: return array; после GET-запроса нужно ставить. Но undefined никуда не исчез...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы