2008-11-13 32 views
63

Tôi có một trang kiểu bảng có các hàng. Mỗi hàng có một hộp kiểm. Tôi có thể chọn tất cả/nhiều hộp kiểm và nhấp vào "gửi" và những gì là một cuộc gọi Jquery ajax cho mỗi hàng.Cách biết khi nào tất cả cuộc gọi ajax hoàn tất

Về cơ bản tôi có biểu mẫu cho mỗi hàng và tôi lặp lại tất cả các hàng đã chọn và gửi biểu mẫu đó thực hiện cuộc gọi jquery ajax.

Vì vậy, tôi có một nút có quyền này:

 $("input:checked").parent("form").submit(); 

Sau đó, mỗi hàng có:

  <form name="MyForm<%=i%>" action="javascript:processRow(<%=i%>)" method="post" style="margin:0px;"> 
       <input type="checkbox" name="X" value="XChecked"/> 
       <input type="hidden" id="XNumber<%=i%>" name="X<%=i%>" value="<%=XNumber%>"/> 
       <input type="hidden" id="XId<%=i%>" name="XId<%=i%>" value="<%=XNumber%>"/> 
       <input type="hidden" id="XAmt<%=i%>" name="XAmt<%=i%>" value="<%=XAmount%>"/> 
       <input type="hidden" name="X" value="rXChecked"/> 
      </form> 

Hình thức này nộp để processRow:

function processRow(rowNum) 
    { 
     var Amount = $('#XAmt'+rowNum).val(); 
     var XId = $('#XId'+rowNum).val(); 
     var XNum = $('#OrderNumber'+rowNum).val(); 
     var queryString = "xAmt=" + "1.00" + "&xNumber=" + OrdNum + "&xId=" + xId; 


     $('#coda_'+rowNum).removeClass("loader"); 
     $('#coda_'+rowNum).addClass("loading"); 


     $.ajax({ 
      url: "x.asp", 
      cache: false, 
      type: "POST", 
      data: queryString, 
      success: function(html){ 
      $('#result_'+rowNum).empty().append(html); 
      $('#coda_'+rowNum).removeClass("loading"); 
      $('#coda_'+rowNum).addClass("loader"); 
      } 
     }); 
    } 

Những gì tôi muốn biết là , từ đây là có một cách tôi có thể nói nếu tất cả các cuộc gọi Ajax của tôi đã hoàn tất. Lý do là muốn bật/tắt nút gửi trong khi tất cả các cuộc gọi này đang diễn ra.

Xin cảm ơn và xin lưu ý rằng tôi đã phải mangle tên biến do độ nhạy của ứng dụng, vì vậy nhiều người trong số họ có thể bị trùng lặp.

+1

Trong khi phát hiện khi tất cả cuộc gọi ajax hoàn tất có giá trị cho bất kỳ thiết kế nào, tôi nghĩ giải pháp tổng thể tốt hơn là gửi nhiều hàng cùng một lúc. Gửi mỗi hàng như một bài đăng ajax riêng biệt sẽ thực sự * thực sự khó khăn trên hệ thống theo một số cách, và không phải là ý kiến ​​của tôi về thiết kế tốt nhất. Tôi thậm chí sẽ đi xa như vậy để nói rằng * Tôi hứa * rằng một ngày nào đó, nếu bạn dính vào thiết kế này của một-ajax-call-per-row, bạn sẽ hối tiếc. – ErikE

+0

Ngoài vấn đề thiết kế được chỉ ra bởi @ErikE, tôi ngạc nhiên không ai đề cập đến việc sử dụng Lời hứa để trả lời câu hỏi gốc. –

Trả lời

106

Cách dễ dàng

Cách đơn giản nhất là sử dụng .ajaxStop() event handler:

$(document).ajaxStop(function() { 
    // place code to be executed on completion of last outstanding ajax call here 
}); 

Cách cứng

Bạn cũng có thể tự phát hiện nếu bất kỳ cuộc gọi ajax vẫn còn hoạt động:

Tạo biến chứa số lượng kết nối Ajax đang hoạt động:

var activeAjaxConnections = 0; 

ngay trước khi mở increment kết nối Ajax mới mà biến

$.ajax({ 
    beforeSend: function(xhr) { 
    activeAjaxConnections++; 
    }, 
    url (...) 

trong success kiểm tra phần nếu biến đó bằng zero (nếu như vậy, kết nối cuối cùng đã kết thúc)

success: function(html){ 
    activeAjaxConnections--; 
    $('#result_'+rowNum).empty().append(html); 
    $('#coda_'+rowNum).removeClass("loading"); 
    $('#coda_'+rowNum).addClass("loader"); 
    if (0 == activeAjaxConnections) { 
    // this was the last Ajax connection, do the thing 
    } 
}, 
error: function(xhr, errDesc, exception) { 
    activeAjaxConnections--; 
    if (0 == activeAjaxConnections) { 
    // this was the last Ajax connection, do the thing 
    } 
} 

Như bạn có thể thấy, tôi đã thêm cũng kiểm tra trả lại có lỗi

+3

làm thế nào bạn có thể loại bỏ trình xử lý ajaxStop một lần nữa sau khi nó đã được kích hoạt? – rob

+0

http://stackoverflow.com/questions/3709597/wait-until-all-jquery-ajax-requests-are-done –

+2

Về 'Cách cứng': Không cần phải mantain biến, Jquery đã làm điều này: $ .active giữ số lượng hiện tại của các cuộc gọi ajax hoạt động – Sebastianb

21

Một giải pháp gọn gàng sẽ được sử dụng;

$("body").ajaxStop(function() { 
    //Your code 
}); 

Để biết thêm thông tin, hãy xem jQuery.ajaxStop chức năng tại http://api.jquery.com/ajaxStop/

-1

Làm thế nào về chỉ đơn giản là sử dụng nếu?

success: function(html){ 
    if(html.success == true){ 
      $('#result_'+rowNum).empty().append(html); 
      $('#coda_'+rowNum).removeClass("loading"); 
      $('#coda_'+rowNum).addClass("loader"); 

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