繁体   English   中英

jQuery Ajax responseText返回未定义,但是当我将其记录为对象时,它返回ajax文本

[英]Jquery Ajax responseText returns undefined but when i log it as an object it returns the ajax text

responseText返回未定义,但是当我将其记录为对象时,它返回ajax文本。 我认为在将文本分配给变量之前,可能与readystate尚未准备好有关

当我这样做时:

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

您说得对,这是一个时间问题。 jqXHR-Object存在,但是在分配对象时responseText不存在。 但是在登录时它确实显示。 如果使用console.log(JSON.stringify(track))登录,则不应看到responseText的属性。

因此,通过使用readyStateChange或类似机制的回调来等待答复。

问题出在日志记录功能(我假设是firebug或chrome的检查器?)上,它实际上并没有冻结对象,而是在您看起来时按原样显示它。

您试图在调用完成之前使用ajax调用的结果。 调用完成后,Javascript将继续执行所有代码。 由于您没有任何数据,因此在调用完成之前为空。

您想要修改$.get()并向其传递一个函数,以在调用完成后执行该函数。

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

您也可以只发送参数而无需创建url。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM