2013-05-29 3 views
0

responseText возвращает undefined, но когда я регистрирую его как объект, он возвращает текст ajax. Я думаю, что это, возможно, что-то делать с readystate не готов, прежде чем он присваивает текст переменнойJQuery Ajax responseText возвращает undefined, но когда я регистрирую его как объект, он возвращает текст ajax

Когда я делаю это:

function loadTrack(){ 
    var min = -10; 
    var max = 10; 
    var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; 
    var track = $.get("generate_song.php?track_number="+randomNumber); 
     if(randomNumber > 0 && randomNumber !== previousNumber){ 
      previousNumber = randomNumber; 
     }else{ 
      randomNumber = 1; 
     } 

     console.log(track); 
} 

я получаю это:

Object {readyState: 1, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function…} 
abort: function (e){var t=e||w;return u&&u.abort(t),k(0,t),this} 
always: function(){return i.done(arguments).fail(arguments),this} 
complete: function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this} 
done: function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this} 
error: function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this} 
fail: function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this} 
getAllResponseHeaders: function(){return 2===b?a:null} 
getResponseHeader: function (e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t} 
overrideMimeType: function (e){return b||(p.mimeType=e),this} 
pipe: function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()} 
progress: function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this} 
promise: function (e){return null!=e?x.extend(e,r):r} 
readyState: 4 
responseText: "Audio_Files/09%20Dream%20of%20Witches%20Dinner%2C%20V%20mov.%20f.m4a.mp3<br/>" 
setRequestHeader: function (e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this} 
arguments: null 
caller: null 
length: 2 
name: "" 
prototype: Object 
__proto__: function Empty() {} 
<function scope> 
state: function(){return n} 
status: 200 
statusCode: function (e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this} 
statusText: "OK" 
success: function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this} 
then: function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()} 
__proto__: Object 

Но когда я делаю это:

function loadTrack(){ 
    var min = -10; 
    var max = 10; 
    var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; 
    var track = $.get("generate_song.php?track_number="+randomNumber); 
     if(randomNumber > 0 && randomNumber !== previousNumber){ 
      previousNumber = randomNumber; 
     }else{ 
      randomNumber = 1; 
     } 

     console.log(track.responseText); 
//or if i just do it when assigning track 
} 

я получаю это:

undefined script.js:41 
XHR finished loading: "http://localhost/generate_song.php?track_number=10". jquery.js:6 
+1

AJAX является асинхронным. –

+0

Извините, я не понимаю – user2426607

+0

Возможный дубликат [Как вернуть ответ от вызова AJAX?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from- a-ajax-call) –

ответ

-1

Вы пытаетесь использовать результаты вызова ajax до завершения вызова. Javascript будет продолжать выполнять весь код после того, как вызов будет выполнен. Поскольку у вас нет данных, оно равно null, пока вызов не будет завершен.

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

$.get("generate_song.php", {track_number: randomNumber}, function(track){ 
    console.log(track); 
}); 

Вы также можете просто отправить параметры без создания URL-адреса.

http://api.jquery.com/jQuery.get/

0

Вы любезны, это проблема времени. Объект jqXHR-Object существует, но responseText не входит в момент назначения объекта. Но во время регистрации он показывает. Вы не должны видеть свойство responseText, если вы используете протокол console.log(JSON.stringify(track)).

Итак, дождитесь ответа, используя обратный вызов для readyStateChange или аналогичные механизмы.

Проблема связана с функцией ведения журнала (я предполагаю, что firebug или инспектор хрома?), Который на самом деле не замораживает объект, но показывает, что он в то время как вы смотрите.

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