2012-04-27 79 views
6

我正在阅读jQuery中的延迟对象。任何人都可以告诉我下面两种调用方式有什么区别?

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

而什么样的情况下是适用于上述第一种方式?

在此先感谢。

回答

16

$.when.apply(null, a method)才有意义,如果的方法实际上是一个阵列或方法呼叫返回一个数组。然后它就像一个$.when(elements, of, the, array)See MDN有关apply方法的详细说明。我想你的意思是$.when(a method)。在这种情况下,方法应该再次是方法调用返回延迟对象或指向延迟对象的变量。

$.when()语法$.when(one, or, more, deferreds) - 所以,如果你想传递多个deferreds这是一个数组,你需要.apply()因为你不希望建立方法调用作为一个字符串,并使用eval(这的确是在这种情况下,邪恶)。

+0

参见[MDN:'fun.apply()'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/应用)&[Eloquent JavaScript](http://eloquentjavascript.net/chapter6.html#key5) – gnarf 2012-04-27 05:39:07

+0

+1 for $ .when.apply(null,一种方法) – marverix 2013-10-17 07:34:27

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); 
}); 

什么来加载exacly 3个配置后执行一些代码? 你可以这样做:

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

但对于加载ň配置,其中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 
}); 
相关问题