2013-06-28 2 views
4

Я уверен, что делаю это все виды неправильно, но у меня есть следующая функция, возвращающая «undefined» в консоли, хотя она может console.log() запрашиваемые значения из одного и того же места в как прокомментировано в коде.javascript function return undefined

var tags = [4, 5]; 
console.log(getTagNames(tags)); // 'undefined' 

function getTagNames(tagArray) { 

    $.getJSON('js/tags.json', function(data) { 
     for (var i in tagArray) { 
      tagArray[i] = tagArray[i].toString(); 
      var val = tagArray[i]; 

      for (var t in data) { 
       var tag = data[t]; 
       var tagName = tag.alias; 
       var tagId = tag.id; 
       if (val === tagId) { 
        tagArray[i] = tagName; 
       } 
      }; 
     } 
     console.log(tagArray); // output ["foo", "bar"] 
     return tagArray; 
    }); 
} 

Другая странность в том, что, после выполнения этого кода в браузере, можно ввести «метки» в консоли браузера, и это дает мне правильный результат ["foo", "bar"]. Однако, когда я пытаюсь использовать переменную тегов (например, текстовое значение для элемента и т. Д.), Он не работает ... Что дает? JavaScript не является моим первым языком, поэтому я немного смущен тем, как он себя ведет. Я просто не понимаю.

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

Примечание:

  1. JSON от таблицы (3.1) теги Joomla.
  2. Я могу получить данные.
  3. Условие val === tagId условно работает правильно.
  4. Мне нравится попкорн.
+1

'getTagNames' ** не имеет ** оператора' return'. Единственная функция с оператором 'return' в вашем вопросе - анонимная функция, которую вы передаете' getJSON'. – Quentin

ответ

9

Звонок в getJSON вызывает функцию обратного вызова асинхронно.

Если вам нужна функция getTagNames и называть его много места в вашем коде, вы можете внести изменения, чтобы сделать его взять саму функцию обратного вызова:

function getTagNames(tagArray, cb) { 

    $.getJSON('js/tags.json', function(data) { 
     for (var i in tagArray) { 
      tagArray[i] = tagArray[i].toString(); 
      var val = tagArray[i]; 

      for (var t in data) { 
       var tag = data[t]; 
       var tagName = tag.alias; 
       var tagId = tag.id; 
       if (val === tagId) { 
        tagArray[i] = tagName; 
       } 
      }; 
     } 
     console.log(tagArray); // output ["foo", "bar"] 
     cb(tagArray); 
    }); 
} 

, а затем совершать звонки на него так:

getTagNames(tags, function(tagArray) { 
    // do something with tagArray 
}); 
+0

Я думаю, что его функция «обратного вызова», которую я не получаю, когда мне нужно совершать вызовы функции getTagNames. Как и здесь, здесь представлен параметр tagArray. И что бы я хотел с этим сделать. Я предполагаю, что я использую слишком php только для возврата значения. – jremydeaton

+1

tagArray копируется (как и большинство кода) из вашего оригинала. Таким образом, tagArray заполняется вызовом getTagNames. Второй передаваемый вами параметр - это функция, которая обрабатывает «возвращаемое значение», когда вызов getTagNames «завершен». – mbanzon

2

Заявление return tagArray; возвращает результат из success обработчика getJSON, который, во-первых, не ожидает возвращаемого значения, а во-вторых, происходит асинхронно - путь после того, как ваш getTagNames закончил выполнение.

+1

Это почти тот ответ, который я получил от других вопросов, которые я просматривал, и только наполовину понимаю, как это работает. Тем не менее, я не могу найти какой-либо справочный материал, который затуманивает мое нынешнее понимание всей концепции. Продолжая читать некоторые материалы, я могу поразить момент «AH HA». Любое место, которое любой человек может направить мне (желательно на основе учебника), очень ценится. – jremydeaton