2012-04-27 12 views
0

I以下のパラメータがあります。

a = [{param:'a'}, {param:'b'}, {param:'c'}] 

が、私はこのように、各パラメータのGETリクエストをしたいのですが:

a.map(function(ai){return $.get('myapi/get?ai='+ai.param)}) 

すべての取得リクエストが完了したら、どうすればよいですか?

私はこのように、$ .whenを使用して試してみました:私はdo_something_with(a)を呼び出すときに、私は新しい.result属性を持っていないよう

$.when(
    a.map(function(ai){return $.get('myapi/get?ai='+ai)}) 
) 
.done(function(results){ 
    results.forEach(function(ri, i){ 
     ri.success(function(result){ 
      a[i].result = result 
     } 
    } 
    do_something_with(a) 
} 

が、残念ながら私ははっきりとこの$.when().done()イディオムを誤解しています。私は、が1つの配列を見ているので、getが完了するのを待つのではなく、.done()にまっすぐに通るので、それは推測しています。

助けていただけたら幸いです!

+0

「ri.success」とは何ですか? 'ri'はAJAX呼び出しから返された結果です(または、コード内の他のエラーではない場合)、遅延/' jqXHR'オブジェクトではありません。 – Tgr

答えて

2

あなたが必要:

$.when.apply($, myArray); 

すなわちthis === $$.when()を呼び出すためにFunction.applyを使用し、残りの引数は、その配列が、各呼び出しで返された繰延オブジェクトを含む配列myArray、の内容ています$.get


は、あなたがそれぞれのAJAX呼び出しの完了時に解決される繰延オブジェクトの新しい配列を返します。このマップ機能を通じて繰延オブジェクトのあなたの配列を渡すことができ、あなたのコメントから2つ目の質問に答えるためにそれが成功したかどうかにかかわらず。

var alwaysDef = def.map(function(old) { 
    var def = $.Deferred(); 
    old.always(def.resolve); 
    return def; 
}); 

私はパラメータ(もしあれば)は、この例では、最終的な.done関数に渡されることになりますかわからないんだけど注意してください。

ことが重要ならば、繰延オブジェクトは常に順番に呼ばれているので、あなたは、後で使用するためのアレイでAJAXの結果を格納し、元の約束ごとに.doneハンドラを登録することができ、かつnullを格納.failハンドラ代わりに値。

これにより、それぞれの結果が利用可能になるまで、最後の.whenハンドラが呼び出されなくなります。

+0

これは早かった! .done()のレスポンスを扱うときに同じトリックを使用しますか? –

+0

@MikeDewar '.done()'では、AJAX呼び出しごとにAFAICRを返すために 'arguments'擬似配列を使う必要があります。 – Alnitak

+0

doneコールバック内でconsole.log(arguments)を使用して、引数に含まれる内容を確認します。オブジェクトまたは配列の配列でなければなりません。 –

関連する問題