这让我很难过。我有一个url数组(用于数据),我需要将其拉入页面并在加载所有内容后处理结果。我正在尝试使用JQuerys Deffered功能来确保在处理结果之前所有的ajax调用都已完成。我一介绍它(when()。done()功能),我的responseText就神奇地消失了。
我最简单的例子:
$.when([$.ajax("pathToData")]).done(
function(results) {
console.log(results[0]); //object with a responseText attribute
console.log(results[0].responseText); //undefined !!!
}
)
我怀疑我遗漏了一些简单的东西,但是我阅读的文档越多,这看起来就越正确。我希望其他人能够轻松地发现问题,并指出我正确的方向。提前谢谢!
答案 0 :(得分:4)
您看到的奇怪行为是console
的限制,实际上与您的代码无关。
在您展开Object
中的console
之前,会延迟对象属性的分辨率。到那时AJAX请求已经完成,responseText
可用。但是,results[0].responseText
的值会立即解决为undefined
。
如果你这样做了:
$.when([$.ajax({
url: '/echo/json/',
type: 'POST',
data: {json: '{"a":12}'}
})]).done(function(results) {
console.log(JSON.stringify(results[0])); //object with a responseText attribute
console.log(results[0].responseText); //undefined !!!
})
你会看到:
{"readyState": 1}
undefined
相反。
至于如何解决你的问题;我从来不知道$.when()
接受数组,文档也没有说它。因此,when()
似乎立即执行done()
,因为数组不是延迟的(根据文档):
如果将单个参数传递给jQuery.when且它不是Deferred,则将其视为已解决的Deferred,并且将立即执行附加的所有doneCallbacks。
而是将您的AJAX请求作为单独的参数传递,如文档中所示:
$.when($.ajax('a'), $.ajax('b')).done(function (a, b) {
// a & b = [ "success", statusText, jqXHR ]
});
因此:
$.when($.ajax({
url: '/echo/json/',
type: 'POST',
data: {json: '{"a":12}'}
}), $.ajax({
url: '/echo/json/',
type: 'POST',
data: {json: '{"b":12}'}
})).done(function(a, b) {
console.log(a[2].responseText);
console.log(b[2].responseText);
});
你得到:
{"a": 12}
{"b": 12}
...还有一个更新的小提琴:http://jsfiddle.net/39mHw/2/
答案 1 :(得分:0)
设置为results
的是一个表示3个内容的数组 - textStatus(即“success”),statusText和jqXHR对象 - 按此顺序。
您需要访问数组位置2以获取具有responseText
属性的jqXHR对象。因此,只需更改您的索引值:
$.when($.ajax("pathToData")).done(
function(results) {
console.log(results[2]); //object with a responseText attribute
console.log(results[2].responseText); //undefined !!!
}
)
请注意,我已删除ajax()
函数调用周围的数组括号。
以下是jQuery when()
页面(http://api.jquery.com/jQuery.when)的确切示例:
$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2){
/* a1 and a2 are arguments resolved for the
page1 and page2 ajax requests, respectively */
var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
if ( /Whip It/.test(jqXHR.responseText) ) {
alert("First page has 'Whip It' somewhere.");
}
});