2012-06-09 29 views

Trả lời

48

Tùy thuộc vào trường hợp sử dụng của bạn, bạn cũng có thể sử dụng jQuery.when [1]:

Nếu một đối số duy nhất được truyền cho jQuery.when và nó không phải là một thu nhập hoãn lại, nó sẽ được coi như một giải quyết thu nhập hoãn lại và bất kỳ thẻ được thực hiện nào được đính kèm sẽ được thực thi ngay lập tức.

Với jQuery.when bạn có thể đối xử với đối tượng bí ẩn của bạn luôn luôn như trì hoãn:

// x could be a deferred object or an immediate result 
var x = getMysteriousObject(); 
// success will be called when x is a deferred object and has been resolved 
// or when x is an immediate result 
jQuery.when(x).then(success, error); 

[1] http://api.jquery.com/jQuery.when/

+0

Câu trả lời rất hữu ích, cảm ơn bạn! – nrodic

+0

Trình xử lý 'thành công' của bạn sẽ không có các đối số khác nhau được truyền cho nó - tùy thuộc vào đối tượng có bị trì hoãn hay không? Trong trường hợp đó bạn vẫn sẽ phải sử dụng kiểu gõ vịt như những gì được đề xuất bên dưới. – backdesk

+1

@Crungmungus: "Nếu một đối số duy nhất được chuyển đến jQuery.when và nó không phải là Trì hoãn hoặc Lời hứa, nó sẽ được coi là Trì hoãn đã giải quyết và mọi thẻ được thực hiện kèm theo sẽ được thực thi ngay lập tức. " –

29

Vì jQuery Deferred được tạo bằng cách sao chép các phương thức của đối tượng ẩn thay vì gọi toán tử mới trên một hàm, bạn không thể chứng minh rằng đối tượng thực sự là một thể hiện của jQuery.Deferred. Tôi nghĩ rằng bạn sẽ cần phải đi với Duck-Typing:

"Khi tôi nhìn thấy một con chim đi như vịt và bơi như vịt và quacks như vịt, tôi gọi đó là một con vịt." - James Whitcomb Riley

Tùy thuộc vào những gì đối tượng khác có thể được trả lại (những gì thuộc tính phải được dự kiến), kiểm tra xem các thuộc tính đặc biệt/phương pháp được trình bày:

var x = getMysteriousObject(); 
if (x.promise) { 
    // Deferred 
} else { 
    // Not a deferred 
} 

Bạn có thể trình bày chi tiết việc kiểm tra này nếu có yêu cầu :

if ($.isFunction(x.promise)) { 
    // Deferred 
} 

hoặc (để phân biệt giữa các đối tượng thu nhập hoãn lại và triển khai khác của giao diện Promise)

if (x.promise && x.resolve) { 
    // Deferred 
} 
+0

Ok, sau đó tôi nghĩ rằng gõ vịt là cách tốt nhất để đi. Đã lo lắng về việc có được một con chim cút thay vì một con vịt. Bây giờ nghĩ rằng điều đó không quan trọng. Cảm ơn nhiều! – WawaBrother

1

Lấy cảm hứng từ Niko's answer, tôi đã tạo ra một thực hiện mà sẽ kiểm tra nếu một đối tượng là một trì hoãn dựa trên tên thuộc tính của nó nhưng cũng là về nội dung của các thuộc tính đó. Tôi phải làm như vậy vì một vật thể khác của tôi có một tài sản có tên là lời hứa.

if (typeof value.resolve !== "function") { 
    return false; 
} 
return String(value.resolve) === String($.Deferred().resolve); 
Các vấn đề liên quan