0

次のパラメーターがあります。

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

次のように、各パラメーターの取得リクエストを作成したいと思います。

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

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

次のように、$.when を使用してみました。

$.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()イディオムを明らかに誤解しています。各コンポーネントが終了するのを待つのではなく、単一の配列が表示されているため、 に直接渡されるためだと思います。do_something_with(a).resultwhen.done()get

どんな助けでも大歓迎です!

4

1 に答える 1

2

必要なもの:

$.when.apply($, myArray);

つまり、 withFunction.applyを呼び出し、残りの引数は配列の内容です。この配列には、 への各呼び出しによって返される遅延オブジェクトが含まれます。$.when()this === $myArray$.get


コメントからの 2 番目の質問に答えるには、遅延オブジェクトの配列をこの map 関数に渡すことができます。これは、成功したかどうかに関係なく、各 AJAX 呼び出しの完了時に解決される遅延オブジェクトの新しい配列を返します。

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

この場合、最終的にどのパラメーターが (もしあれば) 最終.done関数に渡されるのかはわかりません。

それが重要な場合、遅延オブジェクトは常に順番に呼び出されるため、.done後で使用するために AJAX の結果を配列に格納する元の各 promise のハンドラーと、代わりに値.failを格納するハンドラーを登録できます。null

.whenこれにより、個々の結果がそれぞれ利用可能になるまで、最終ハンドラーが呼び出されないことが保証されます。

于 2012-04-27T20:19:37.937 に答える