2012-01-23 5 views
0

Можно создать дубликат:
Return value from ajax call?
JavaScript asynchronous return value/assignment with jQuery

У меня проблема с тем, что я пытаюсь выполнить итерацию по массиву в JavaScript, но по какой-то причине он не делает этого. Я создаю массив в обратном вызове $ .get() из API last.fm и создаю массив объектов. Когда я потом пытаюсь выполнить итерацию по массиву, это не работает, а длина равна нулю.

Я разместил JSFiddle здесь:

http://jsfiddle.net/MMps2/2/

Любые мысли? Я немного смущаюсь!

Примечание: Всплывающие ваш JS консоль - Я входе вещи к нему ...

+1

Вы не можете ожидать асинхронной установки, чтобы работать, как это. Объект «результаты» не будет создан до тех пор, пока этот вызов API не будет завершен. Код вокруг '$ .get()' однако не будет ждать, пока это произойдет. – Pointy

+0

данные Объект документа, хотя верно? Я думал, что могу передать это в $(), чтобы запросить его? –

+0

О, извините, путайте вывод 'console.log'. –

ответ

3

Ваш $.get запрос выполняется асинхронно. Вы пытаетесь вернуть значение результатов, прежде чем он даже получит шанс выполнить. Вместо этого используйте обратный шаблон для вызова другой функции, когда запрос на получение будет выполнен.

EDIT: Пример:

// Fetch top artists for the passed in username 
$.get('http://ws.audioscrobbler.com/2.0/', {method: 'user.getTopArtists', user: user, api_key: 'c2c920e0749f24f2661d54614335748d'}, function(data) { 

    // No need to use your higher scope results variable anymore 
    var results = []; 

    $('artist', data).each(function(index, artist) { 

     // For each artist in the result, build an object containing the artists name and MusicBrainz ID 
      results.push({ 
       'name': $('name', artist).text(), 
       'mbid': $('mbid', artist).text() 
     }); 

    }); 

    // Here's where such a call would go 
    sendResultsToWhateverObjectNeedsThem(results); 

}); 
+0

Ах да, это имеет смысл. Я знал, что $ .get был асинхронным, но я смотрел на него часами и не мог его увидеть! Я хотел, чтобы это была хорошая универсальная функция, поэтому я хотел «вернуть» результаты. Я изменил его сейчас, так что исходная функция принимает дополнительный аргумент, в котором вы можете указать свой обратный вызов. Спасибо за помощь! –