2011-04-06 25 views
10

tôi có hai chức năng javascript, save()saveAll(), thiết lập như sau:nâng deferred.then jquery() một lần tất cả các đối tượng hoãn lại đã được giải quyết

function save(data) { 
    return $.post('/save', data); 
} 

function saveAll(callback) { 
    var dataArray = []; 
    $.each(dataArray, function() { 
     save(this); 
    }); 
    callback(); 
} 

tôi quan tâm trong việc sửa đổi saveAll() để nó thúc đẩy đối tượng jquery deferred, và tăng hàm callback khi tất cả các hoạt động save() đã hoàn tất. tuy nhiên, tôi không chắc chắn về cú pháp chính xác ... cụ thể là liên quan đến $ .each() bên trong của $ .when(). nó sẽ là một cái gì đó như thế này?

function saveAll(callback) { 
    var dataArray = []; 
    $.when(
     $.each(dataArray, function() { 
      return save(this); 
     }) 
    ).then(callback); 
} 

Trả lời

21

như Eli đã chỉ ra, $ .when() chấp nhận danh sách đối số được phân cách bằng dấu phẩy chứ không phải mảng. sử dụng Function.apply() để vượt qua trong mảng dường như để làm các trick.

function saveAll(callback) { 
    var dataArray = [], deferreds = []; 
    $.each(dataArray, function() { 
     deferreds.push(save()); 
    }); 

    $.when.apply(window, deferreds).then(callback); 
} 
+2

Điều này thật tuyệt vời, chỉ tìm kiếm điều này. Tôi ngạc nhiên jQuery không cho phép một mảng các đối tượng trì hoãn một cách tự nhiên. –

+10

Chỉ cần cẩn thận, bởi vì một thực tế ít được biết về $ .when là nó sẽ ngay lập tức giải quyết nếu bất kỳ một trong các đối số bị từ chối/thất bại, mà không cần chờ đợi phần còn lại! Đó là sự thật :) Và bất ngờ, nếu bạn hỏi tôi. Tôi đã viết $ .whenAll() luôn đợi tất cả các đối số để giải quyết, bất kể trạng thái thành công/thất bại: http://jsfiddle.net/InfinitiesLoop/yQsYK/ – InfinitiesLoop

1

Bạn sẽ có thể vượt qua một danh sách bằng dấu phẩy của các đối tượng trì hoãn để $.when.then sẽ thực hiện một lần tất cả họ đều đã được giải quyết.

http://api.jquery.com/jQuery.when/

1

Vấn đề tôi nghĩ là $.each đang trở lại dataArray của bạn, không phải là một danh sách các Deferred đối tượng như bạn muốn nuôi để $.when.

+0

bạn nói đúng, giá trị trả về từ $ .each() không phải là những gì tôi muốn. cảm ơn. –

Các vấn đề liên quan