2012-02-10 31 views
26

Tôi đang ở ứng dụng di động và tôi sử dụng nhiều các cuộc gọi Ajax để nhận dữ liệu từ máy chủ web như dưới đâyjquery làm thế nào để sử dụng nhiều ajax gọi một sau khi kết thúc sự khác

function get_json() { 
    $(document).ready(function() { 
     $.ajax({ 
      url: 'http://www.xxxxxxxxxxxxx', 
      data: { 
       name: 'xxxxxx' 
      }, 
      dataType: 'jsonp', 
      //jsonp: 'callback', 
      //jsonpCallback: 'jsonpCallback', 
      success: function(data) { 
       $.each(data.posts, function(i, post) { 
        $.mobile.notesdb.transaction(function(t) { 
         t.executeSql('INSERT into bill (barcode, buildingcode, buildingaddress, flatname, flatdescription, entryseason, period, amount, pastpayments, todaypayments, paydate, receiptno) VALUES (?,?,?,?,?,?,?,?,?,?,?,?);', [post.Id, post.Code, post.Address, post.Name, post.Description, post.EntrySeason, post.Period, post.Revenue, post.PastPayments, post.todaypayments, post.paydate, post.receiptno], 
         //$.mobile.changePage('#page3', 'slide', false, true), 
         null); 
        }); 
        $('#mycontent').append(post.Name); 
       }); 
      } 
     }); 

     $.ajax({ 
      xxxx 
     }); 

     $.ajax({ 
      xxxx 
     }); 
    }); 
} 

Làm thế nào tôi có thể buộc các ajax 2 gọi để bắt đầu sau khi kết thúc đầu tiên ... thứ 3 sau khi kết thúc ngày 2 và tiếp tục?

+0

Điều duy nhất về việc này là cuộc gọi AJAX không thành công sẽ không dẫn đến các cuộc gọi AJAX khác (vì không có "thực hiện điều này nếu cuộc gọi AJAX không thành công", nó sẽ chờ một "thành công" mãi mãi). Có lẽ đó là chính xác những gì bạn muốn ... chỉ cần một cái gì đó để xem xét. –

+0

Tôi nghĩ bạn nên sử dụng $ .when như @Lyon gợi ý. –

Trả lời

31

Đặt chúng vào bên trong của success: của thiết bị dựa vào.

$.ajax({ 
    url: 'http://www.xxxxxxxxxxxxx', 
    data: {name: 'xxxxxx'}, 
    dataType: 'jsonp', 
    success: function(data){ 

     // do stuff 

     // call next ajax function 
     $.ajax({ xxx }); 
    } 
}); 
+0

làm thế nào tôi có thể làm điều này bạn có thể giải thích nó – kosbou

+0

Lặp lại cho nhiều cấp độ của '$ .ajax()' cuộc gọi. –

+0

Bạn có thể đệ quy làm điều này cho một số lượng yêu cầu AJAX không xác định. Hiện tại có một vài câu trả lời cho câu hỏi chứng minh điều này. – Jasper

8

Bọc mỗi cuộc gọi ajax trong một hàm có tên và chỉ cần thêm chúng vào callbacks thành công của các cuộc gọi theo thời gian:

function callA() { 
    $.ajax({ 
    ... 
    success: function() { 
     //do stuff 
     callB(); 
    } 
    }); 
} 

function callB() { 
    $.ajax({ 
    ... 
    success: function() { 
     //do stuff 
     callC(); 
    } 
    }); 
} 

function callC() { 
    $.ajax({ 
    ... 
    }); 
} 


callA(); 
+0

thx cho thời gian của bạn ...và trả lời nhanh chóng của bạn – kosbou

+1

điều này làm cho tên hàm gây hiểu nhầm: callA không chỉ gọi callA mà còn gọi hàm B & C – marstone

42

Bạn đang có phần chặt chẽ, nhưng bạn nên đặt chức năng của bạn trong trường hợp document.ready xử lý thay vì theo cách khác.

Đặt cuộc gọi AJAX của bạn trong một hàm và gọi nó từ callback AJAX:

$(function() { 

    //setup an array of AJAX options, each object is an index that will specify information for a single AJAX request 
    var ajaxes = [{ url : '<url>', dataType : 'json' }, { url : '<url2>', dataType : 'xml' }], 
     current = 0; 

    //declare your function to run AJAX requests 
    function do_ajax() { 

     //check to make sure there are more requests to make 
     if (current < ajaxes.length) { 

      //make the AJAX request with the given data from the `ajaxes` array of objects 
      $.ajax({ 
       url  : ajaxes[current].url, 
       dataType : ajaxes[current].dataType, 
       success : function (serverResponse) { 
        ... 
        //increment the `current` counter and recursively call this function again 
        current++; 
        do_ajax(); 
       } 
      }); 
     } 
    } 

    //run the AJAX function for the first time once `document.ready` fires 
    do_ajax(); 
}); 
+2

Đây phải là câu trả lời được đánh dấu. Rất đẹp. – sohtimsso1970

+1

Holy Ajaxception, Batman! điều này chắc chắn là một quá phức tạp về những gì OP cần. Câu trả lời của @ Lyon đẹp hơn nhiều. – igorsantos07

0
$(document).ready(function(){ 
$('#category').change(function(){ 
    $("#app").fadeOut(); 
$.ajax({ 
type: "POST", 
url: "themes/ajax.php", 
data: "cat="+$(this).val(), 
cache: false, 
success: function(msg) 
    { 
    $('#app').fadeIn().html(msg); 
    $('#app').change(function(){  
    $("#store").fadeOut(); 
     $.ajax({ 
     type: "POST", 
     url: "themes/ajax.php", 
     data: "app="+$(this).val(), 
     cache: false, 
     success: function(ms) 
      { 
      $('#store').fadeIn().html(ms); 

      } 
      });// second ajAx 
     });// second on change 


    }// first ajAx sucess 
    });// firs ajAx 
});// firs on change 

}); 
6

Bạn cũng có thể sử dụng jquery khi nào và sau đó chức năng. ví dụ

$.when($.ajax("test.aspx")).then(function(data, textStatus, jqXHR) { 
    //another ajax call 
}); 

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

+2

cách viết cho 4 cấp độ phân cấp? –

+0

tốc độ hiệu suất như thế nào? –

1

tôi cân nhắc những điều sau đây là thực dụng hơn vì nó không trình tự các cuộc gọi ajax nhưng điều đó chắc chắn là một vấn đề của hương vị.

function check_ajax_call_count() 
{ 
    if (window.ajax_call_count==window.ajax_calls_completed) 
    { 
     // do whatever needs to be done after the last ajax call finished 
    } 
} 
window.ajax_call_count = 0; 
window.ajax_calls_completed = 10; 
setInterval(check_ajax_call_count,100); 

Bây giờ bạn có thể lặp window.ajax_call_count bên trong một phần thành công của các yêu cầu ajax của bạn cho đến khi nó đạt đến số lượng nhất định các cuộc gọi gửi (window.ajax_calls_completed).

4

Đây là giải pháp thanh lịch nhất mà tôi đã sử dụng trong một thời gian. Nó không yêu cầu biến đếm bên ngoài và nó cung cấp mức độ đóng gói tốt đẹp.

var urls = ['http://..', 'http://..', ..]; 

function ajaxRequest (urls) { 
    if (urls.length > 0) { 
     $.ajax({ 
      method: 'GET', 
      url: urls.pop() 
     }) 
     .done(function (result)) { 
      ajaxRequest(urls); 
     }); 
    } 
} 

ajaxRequest(urls); 
-1

Chúng tôi chỉ đơn giản là có thể sử dụng

async: false 

này sẽ làm nhu cầu của bạn.

+0

Không, đây là điều tồi tệ nhất bạn có thể làm vì nó sẽ treo trình duyệt của bạn cho đến khi yêu cầu ajax chưa hoàn thành. –

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