Не удается получить доступ к глобальной переменной в jQuery $ .get внутри функции - PullRequest
6 голосов
/ 06 января 2011

Ниже приведен код, с которым у меня проблемы. По сути, я определяю пустой массив как глобальную переменную (var playlist = []), а затем пытаюсь добавить к нему элементы в вызове jQuery $ .get. Из того, что я прочитал в Интернете, я должен быть в состоянии сделать это! Следующий код выдает ошибку: «Невозможно вызвать метод« play »из undefined». playlist [0] действительно устанавливается внутри функции, оповещение playlist [0] в вызове $ .get дает ожидаемый результат, но он не сохраняется вне функции.

var playlist = [];
function playArtist(artist){
  $.get('media/songs/' + artist,
    function(data){
      for (var i in data){
        playlist[i] = setSong(data[i].Resource.name,'track' + data[i].Media.id,i + 1);
      }
    $('#track-total').text(parseInt(playlist.length));
    },'json'
  );
  playlist[0].play();
}

Может кто-нибудь помочь?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 19 января 2011

Вам не нужно ничего этого делать. Я столкнулся с той же проблемой с моим проектом. то, что вы делаете, это делаете вызов функции внутри обратного вызова on success для сброса глобальной переменной. Пока вы установили асинхронный javascript в false, он будет работать правильно. Вот мой код Надеюсь, это поможет.

 var exists;

 //function to call inside ajax callback 
 function set_exists(x){
     exists = x;
 }

  $.ajax({
     url: "check_entity_name.php",
     type: "POST",
     async: false, // set to false so order of operations is correct
     data: {entity_name : entity},
     success: function(data){
     if(data == true){
        set_exists(true);
     }
     else{
        set_exists(false);
     }
  }
});

if(exists == true){
    return true; 
}
else{
    return false;
}

Надеюсь, это поможет вам.

2 голосов
/ 06 января 2011

Скорее всего, playlist используется до того, как $.get вернется - поскольку вызовы ajax являются асинхронными.Он работает в обратном вызове успеха, потому что он срабатывает после завершения запроса, поэтому он будет содержать ожидаемые данные.

1 голос
/ 06 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...