2014-12-21 5 views
-2

У меня есть следующий код:массива не работает за пределы функции

var vocabWords = []; 
//display each vocab words 
$.getJSON("getData.php", function (data) { 

    $.each(data, function (key, val) { 
     vocabWords.push({ 
      'id': val['id'], 
      'audioURL': val['audioURL'] 
     }); 
     setTimeout(function() { //onclick="play_sound(\''+val['audioURL']+'\');" 
      $(".vocab-list").append($('<li onclick="play_sound(\'' + val['audioURL'] + '\');" class="vocab-word" id="vocab_' + val['id'] + '"><img width="230px" height="230px" src="' + val['imageURL'] + '" /><div><i class="fa fa-play-circle"></i>' + val['word'] + '</div></li>').hide().fadeIn(600)); 
      play_sound(val['audioURL']); 
     }, key * 3000); 
    }); 
    alert(vocabWords[2]['audioURL']); 

}); //end display vocab words 

alert(vocabWords[2]['audioURL']); 

Первых alert() работа ... и показывает правильную информацию, но вторые одно не ... что я делаю не так?

+0

Метод '.getJSON' является асинхронным. Он не блокирует выполнение кода после него. Код '.each' в обратном вызове выполняется только после запроса JSON. Второе предупреждение на самом деле происходит до первого (line-of-code-wise). 'vocabWords' пуст для строки« после »' $ .getJSON'. –

ответ

2

Что мне кажется: функция getJSON() является асинхронной и вызывает предоставленную функцию, когда она принимает данные. Второе предупреждение() вызывается сразу, что почти наверняка перед возвратом данных.

Другими словами, здесь порядковые вещи происходят в:

  1. getJSON() называется
  2. второе предупреждение() называется
  3. данные поступают
  4. функцию с первого предупреждения() называется
+0

Спасибо, я думаю, я продолжаю думать, что javascript является процедурным! Как мне обойти это? – Jake

+0

@Jake: переключитесь на '$ .get()' и поставьте 'async: false' в качестве опции. –

+0

@ Jake Javascript является «процедурным» - однако вы хотите квалифицировать этот термин, то есть. – Qix

0

Выполнение HTTP-запросов в JavaScript/jQuery: асинхронный от defa ии. Это означает, что вы не можете прочитать это как последовательный код.

Функция, которую вы создаете в вызове getJSON, не выполняется немедленно. Он вызывается, как только запрос успешно возвращается. Тем не менее, второе предупреждение запускается сразу после запуска запроса, который к тому времени не вернулся.

1

Javascript является асинхронным по своей природе. Это означает, что первое предупреждение срабатывает до Данные получены с сервера (getData.php).

Это связано с тем, что звонок срабатывает, и позволяет javascript знать, что он завершит функцию обратного вызова, когда сервер действительно вернет ответ.

уборщик способ сделать это было бы с объектом обещание - посмотрите на тех, кто - ниже код использует обещание

$.when($.getJSON('url',function(data){ 
    // do stuff to data in here 

}).done(function(){ 
// carry on normal execution flow here 

}); 

Это полезно, если вам нужно, чтобы обеспечить ответ перед выполнением на то, что вы делали это раньше, хотя это может быть не самая лучшая практика.

Смежные вопросы