2012-04-23 40 views
12

Xin chào, tôi có 2 cuộc gọi ajax trong tập lệnh của mình, tôi cần chúng chạy asnyc để rảnh, nhưng tôi cần thứ hai chờ đến khi lần đầu kết thúc.jQuery Chờ cho đến khi các cuộc gọi asmail async kết thúc

$.ajax({ 
     type: "POST", 
     url: "getText.asmx/ws_getText", 
     data: parO1, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      alert(msg.d.data); 
     } 
     , error: function() { 
      chyba("chyba v požadavku", "df"); 
     } 
    }); 
    if (parO2.length > 0) { 
     $.ajax({ 
      type: "POST", 
      url: "getText.asmx/ws_getText", 
      data: parO2, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (msg) { 
       /*WAIT UNTIL THE FIRST CALL IS FINISHED AND THAN DO SOMETHING*/ 
      } 
     , error: function() { 
      chyba("chyba v požadavku", "df"); 
     } 
     }); 

Vì vậy, có ý tưởng nào không? Cảm ơn

Trả lời

15

Nếu sử dụng jQuery 1.5+, bạn có thể sử dụng jQuery.when() để thực hiện việc này. Một cái gì đó tương tự (rút ngắn các cuộc gọi ajax cho ngắn gọn, chỉ cần vượt qua các đối tượng như bạn đang làm ở trên)

$.when($.ajax("getText.asmx/ws_getText"), 
     $.ajax("getText.asmx/ws_getText")).done(function(a1, a2){ 

    // a1 and a2 are arguments resolved for the 
    // first and second ajax requests, respectively 
    var jqXHR = a1[2]; // arguments are [ "success", statusText, jqXHR ] 
}); 

Bạn không biết trong đó thứ tự mà chúng sẽ trở lại vì vậy nếu bạn đang lăn này bằng tay, bạn sẽ cần kiểm tra trạng thái của yêu cầu khác và đợi cho đến khi nó được trả về.

1

Bạn cần kết nối cuộc gọi thứ hai để được chứa trong cuộc gọi lại của cuộc gọi ajax đầu tiên của bạn. Giống như vậy:

success: function(msg) 
{ 
    alert(msg.d.data); 

    if(par02.length > 0) 
    { 
     // Your 2nd ajax call 
    } 
}, 

Vì JavaScript không chạy trong nhiều chủ đề trên máy khách, bạn không thể chặn chuỗi cho đến khi đáp ứng các điều kiện nhất định.

+0

nhưng điều này sẽ làm cho thời gian thực hiện lâu hơn vì cuộc gọi thứ hai sẽ bắt đầu sau khi cuộc gọi đầu tiên kết thúc, tôi đã nghĩ về điều này: trong cuộc gọi đầu tiên thành công, tôi có thể đặt một số biến thành true và cuộc gọi thứ hai thành công tôi có thể làm while (variable == false) {wait} và tiếp tục, nhưng tôi không biết cách viết đúng cách – user1352324

+0

Cách duy nhất để thực hiện 'wait' sẽ là 'setTimeout' và sau đó kiểm tra biến toàn cầu của bạn. Nhưng về mặt kỹ thuật, điều đó có nghĩa là thời gian chờ của bạn có thể xảy ra sau khi cuộc gọi được thực hiện, nhưng vẫn đang chờ đợi. Bạn sẽ được tốt hơn off chỉ đơn giản là hiển thị cho người sử dụng một gif quay hoặc một cái gì đó để cho biết máy chủ đang làm việc. – Tejs

0

Đây là một câu trả lời khác khi chạy yêu cầu ajax kép. Giống như Tejs, người dùng thực hiện cuộc gọi ajax trong phương pháp thành công ...

Các tấm áp phích tuyên Bạn nên có phương pháp thành công khởi động một yêu cầu ajax mới .."

Having two $.ajax() calls in one script

1

Sử dụng jquery

$.ajax({ 
     type: "POST", 
     async:false, // ** CHANGED ** 
     url: "getText.asmx/ws_getText", 
     data: parO1, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      alert(msg.d.data); 
     } 
     , error: function() { 
      chyba("chyba v požadavku", "df"); 
     } 
    }); 
+0

Cảm ơn câu trả lời của bạn. Tôi đã chỉnh sửa nó bằng cách thêm một số định dạng mã để cải thiện khả năng đọc. – vlasits

+0

@vlasits dường như không làm cho nó đậm như người ta nghĩ, tôi đã gửi một bản chỉnh sửa với nhận xét để giải thích những gì đang diễn ra – flyingfisch

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