6

jQueryで遅延オブジェクトを読んでいます。次の2つの呼び出し方法の違いを教えてください。

  1. $.when.apply(null, a method).done(function(){success callback})
  2. $.when.(a method).done(function(){success callback})

そして、上記の最初の方法にはどのようなケースが適していますか?

前もって感謝します。

4

2 に答える 2

16

$.when.apply(null, a method)メソッドが実際に配列であるか、配列を返すメソッド呼び出しである場合にのみ意味があります。次に、それはのようなもの$.when(elements, of, the, array)です。メソッドの詳細な説明については、MDNを参照してください。apply

$.when.(a method)まったく意味がありませんが、あなたが意味したと思います$.when(a method)。この場合、メソッドは、遅延オブジェクトまたは遅延オブジェクトを指す変数を返すメソッド呼び出しである必要があります。

の構文$.when()$.when(one, or, more, deferreds)-です。したがって、配列内にある複数の遅延を渡す場合は.apply()、メソッド呼び出しを文字列として作成して使用する必要がないため、これが必要になりますeval(この場合は実際にです)。

于 2012-04-27T05:33:43.740 に答える
1

Deferredは、リモート呼び出し(つまり、ajax)の応答後にコードを実行するために作成されました。

だからあなたは持つことができます:

load_conf = function (user_id) {
    var def = $.Deferred()
    $("http://get_conf_data_url?user_id="+user_id).done(function (data) {
        var processed_conf = do_something_with(data);
        def.resolve(processed_conf);
    })
    return def.promise();
}

だからあなたは行くことができます:

load_conf(1).done(function (processed_data) {
    do_something_with(processed_data);
});

正確に3つの構成をロードした後、いくつかのコードを実行するのはどうですか?あなたは次のようなことをすることができます:

$.when(load_conf(1), load_conf(2), load_conf(3)).done(function (c1, c2 ,c3) {
     console.log("configurations: ", c1, c2, c3);
})

しかし、Nが可変であるN個の構成をロードした後にいくつかのコードを実行するのはどうですか?この場合、Function.prptotype.applyメソッドを使用できます。関数内で「this」として扱われるオブジェクトを最初の引数として渡すことができます。2番目の引数はパラメーターのリストですが、配列内にあります。

だからあなたはこのように行くことができます:

var defs = [];
for (var i=1; i<=N; i++) {
   defs.push(load_conf(i));
}
// here's the magic
$.when($,defs).done(function () {
   console.log("All conf loaded: ", arguments);
   // arguments contains N processed answers
});
于 2014-03-14T21:46:23.877 に答える