6

我正在阅读 jQuery 中的延迟对象。谁能告诉我以下两种调用方式有什么区别?

  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”。第二个参数是参数列表,但在数组中。

所以你可以这样:

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 回答