JQuery when()then()导致缺少ajax responseText

时间:2012-12-18 18:36:24

标签: jquery ajax deferred responsetext

这让我很难过。我有一个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 !!!
    }
)

我怀疑我遗漏了一些简单的东西,但是我阅读的文档越多,这看起来就越正确。我希望其他人能够轻松地发现问题,并指出我正确的方向。提前谢谢!

2 个答案:

答案 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.");
   }
});