4

これは私を困惑させました。私は(データ用の)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 !!!
    }
)

単純なものが欠けていると思いますが、ドキュメントを読めば読むほど、これは正しいように見えます。他の誰かが問題を簡単に見つけて、正しい方向に向けてくれることを願っています。前もって感謝します!

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のは、textStatus (つまり「成功」)、statusText、および jqXHR オブジェクトの 3 つをこの順序で表す配列です。

属性を持つ jqXHR オブジェクトを取得するには、配列位置 2 にアクセスする必要がありresponseTextます。したがって、次のようにインデックス値を変更するだけです。

$.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 に答える