2010-10-17 46 views
14

Tôi có một số cuộc gọi ajax trong document.ready của tôi()jquery: đợi cho đến khi tất cả các cuộc gọi ajax xong sau đó tiếp tục

như:

for (j=1; j <= 7; j++){ 
    (function(index) { 
    $.getJSON('my.php', {id:index}, 
     function(data) { 
     $.each(data, function(index2, array){ 
     ........ 
     }); 
     }); 
    })(j) 
} 

//DO NOT CONTINUE UNTIL FINISH AJAX CALLS 

........ 
MORE JQUERY CODE 

Làm thế nào tôi có thể buộc nó phải chờ và không tiếp tục cho đến khi chúng tôi nhận được tất cả các cuộc gọi lại từ các yêu cầu ajax?

+0

Xem câu trả lời khác của tôi ở đây: http://stackoverflow.com/a/11315571/49885, ajaxStop là những gì bạn muốn, nó được xây dựng trong từ jquery 1.0 –

Trả lời

16

tôi không thích bất kỳ câu trả lời nào cả, cách tốt nhất (kể từ Jquery 1.5 +) là sử dụng đối tượng thu nhập hoãn lại, đó là những đối tượng để thao tác cuộc gọi async , bạn có thể giải quyết:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")) 
    .then(myFunc, myFailure); 

Bằng cách này myFunc thực hiện sau khi 2 cuộc gọi ajax được thực hiện và myFailure nếu một trong hai lỗi có lỗi.

Bạn có thể đọc thêm về nó trong tài liệu chính thức jquery: JQuery Deferred Object

tôi viết giải pháp này nếu có ai nhìn thấy bài này nó có thể hữu ích.

Xin lỗi tiếng anh của tôi: P

+1

Dù bạn gọi chúng là gì - các đối tượng trì hoãn, lời hứa, v.v. - những thứ đó dường như là một giải pháp tốt hơn nhiều so với các vòng song song với tôi –

1

bạn có thể sử dụng những thành công (tức là một hàm callback của ajax jquery) như dưới đây:

$.ajax({ 
    url: url, 
dataType: 'json', 
data: data, 
success: function(data){ 
//Write your code here. 
    } 
}); 

Bạn có thể nhận được tài liệu của ajax dưới đây -

ajax

+0

làm thế nào tôi có thể sử dụng nó trong mã của tôi? –

+1

@Haim Evgi: Di ​​chuyển mã bạn có sau cuộc gọi và bạn muốn thực hiện sau khi cuộc gọi kết thúc bên trong cuộc gọi lại. –

+0

Tôi đã chỉnh sửa mã theo yêu cầu của bạn. Bạn có thể sử dụng ajax thay vì getjson như mô tả ở trên. – Alpesh

6

Trước hết, bạn có thể muốn để xem xét thực hiện mã khởi động trong một cuộc gọi.
Thứ hai: Thay vì chờ đợi, chỉ cần gọi một cuộc gọi chức năng khác. cho mã trên nó sẽ giống như thế:

for (j=1; j <= 7; j++){ 
    (function(index) { 
    $.getJSON('my.php', {id:index}, 
     function(data) { 
     $.each(data, function(index2, array){ 
     ........ 
     }); 

     if (j === 7) { 
      initDoneDoMoreStuff() 
     } 
     }); 
    })(j) 
} 

hoặc kích hoạt:

for (j=1; j <= 7; j++){ 
    (function(index) { 
    $.getJSON('my.php', {id:index}, 
     function(data) { 
     $.each(data, function(index2, array){ 
     ........ 
     }); 

     if (j === 7) { 
      $(document).trigger("initdone"); 
     } 
     }); 
    })(j) 
} 

$(document).bind("initdone", function() {....}); 
+0

Cảm ơn, điều này làm việc tốt đẹp cho tôi.(initdone kích hoạt) – tsdexter

+0

Tôi đã thử sử dụng async: false và vẫn gặp sự cố. Giải pháp để gọi hàm submit trong ajax là hoàn hảo. Cảm ơn! –

3

Nó wasn't dễ dàng cho tôi để làm điều đó, nhưng có lẽ bạn tìm thấy mã của tôi hữu ích. Đó là một quá trình để gửi tất cả các hình thức trong dom và sau khi tất cả chúng được lưu trữ, chuyển hướng người dùng đến một trang khác.

formulario = $('form'); 
formulariolongitud = formulario.length; 
i = 0; 

formulario.each(function(index, value) { 
    $(this).ajaxSubmit({ 
     async: false,//not sure i 
     success: function() { 
      i++; 

      if(i === formulario.length) {//this is the last one to submit 
       window.location.replace(whatever); 
      } 
     } 
    });       
}); 
0

Vấn đề với điều gì đó xảy ra nếu (j == 7) là tình huống khi yêu cầu thứ 7 rất nhanh và thậm chí một trong những yêu cầu khác rất chậm. Mặc dù bạn đã xếp hàng cuối cùng, nhưng nó có thể không phải là người cuối cùng để hoàn thành.

Câu trả lời này dường như làm việc cho tất cả các điều kiện: https://stackoverflow.com/a/3709809/813154

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