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