4

这让我很难过。我有一个 url 数组(用于数据),我需要将其拉入页面并在全部加载后处理结果。我正在尝试使用 JQuerys Defered 功能来确保在处理结果之前所有 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 !!!
    }
)

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

4

2 回答 2

5

您看到的奇怪行为是 的限制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/

于 2012-12-18T18:56:53.533 回答
0

被设置的results是一个数组,它代表 3 个东西 - textStatus(即“成功”)、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()这里删除了函数调用周围的数组括号。

when()这是来自 jQuery页面 ( 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.");
   }
});
于 2012-12-18T18:45:13.057 回答