2012-04-27 29 views
6

Tôi đang đọc đối tượng trì hoãn trong jQuery. Bất cứ ai có thể xin vui lòng cho tôi biết sự khác biệt giữa sau hai cách gọi là gì?

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

Và những loại trường hợp phù hợp cho cách đầu tiên ở trên?

Xin cảm ơn trước.

Trả lời

16

$.when.apply(null, a method) chỉ có ý nghĩa nếu phương thức thực sự là mảng hoặc phương thức gọi trả về mảng. Sau đó, nó giống như một $.when(elements, of, the, array). See MDN để biết mô tả chi tiết về phương pháp apply.

$.when.(a method) không có ý nghĩa gì cả, nhưng tôi đoán bạn có nghĩa là $.when(a method). Trong trường hợp này một phương thức một lần nữa phải là phương thức gọi trả về đối tượng trì hoãn hoặc biến trỏ đến đối tượng trì hoãn.

Cú pháp của $.when()$.when(one, or, more, deferreds) - vì vậy nếu bạn muốn vượt qua nhiều deferreds mà đang ở trong một mảng, bạn cần .apply() vì bạn không muốn xây dựng các lời gọi phương thức như là một chuỗi và sử dụng eval (mà thực sự là ác trong trường hợp này).

+0

Xem [MDN: 'fun.apply()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/ áp dụng) & [JavaScript thông dụng] (http://eloquentjavascript.net/chapter6.html#key5) – gnarf

+0

+1 cho $ .when.apply (null, phương thức) – marverix

1

Trì hoãn được tạo để thực thi mã sau phản hồi của một số lệnh gọi từ xa (ví dụ: ajax).

vì vậy bạn có thể có:

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

vì vậy bạn có thể đi:

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

gì về thực hiện một số mã sau khi tải exacly 3 cấu hình? Bạn có thể làm một cái gì đó như:

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

Nhưng những gì về thực hiện một số mã sau khi tải cấu hình N trong đó N là biến? Đối với trường hợp này, bạn có thể sử dụng phương thức Function.prptotype.apply. Bạn có thể chuyển làm đối số đầu tiên một đối tượng sẽ được coi là "this" bên trong hàm. Đối số thứ hai là danh sách các tham số nhưng bên trong một mảng.

vì vậy bạn có thể đi như thế này:

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 
}); 
Các vấn đề liên quan