あなたが見ている奇妙な振る舞いはの制限であり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/