DanielAttard
DanielAttard

Reputation: 3595

Delay subsequent ajax call until first ajax call is complete

I am having some trouble with the timing of javascript events. The problem I am having is that one part of the code seems to be executing before another part of the code completes. I need to ensure that the first code finishes before the latter code begins. Here is the initial code:

function(){     
    myLoop();  //this needs to complete before the call to myMethod below 
    $.ajax({
    url: sURL + "myController/myMethod",
    success: function() {       
    $.msg("My Success Message",{live:10000});
    error: function(){
    $.msg("My Error Message",{live:10000});
});
}

And here is the code that loops and inserts records into a db:

function myLoop(){
$('input[name=c_maybe].c_box').each(function(){
if( $(this).prop('checked') ){ 
    var rn = $(this).prop('value'); 
    $.ajax({
        url: sURL + 'myController/myInsert',
        type:"POST",
        dataType: 'text',
        data: {'rn': rn},
        success: function(data) {
            //not sure what to do on success.
        }
    });
} 
}); 
} 

The problem that seems to be happening is that the call to myController\myMethod is happening before myLoop completes inserting all the records into the database.

Can someone suggest a way for me to redesign this code so that I can ensure that myController\myMethod is not called until myLoop has completely finished?

Thanks.

Upvotes: 1

Views: 1400

Answers (3)

Munish Poonia
Munish Poonia

Reputation: 838

You can make the ajax call synchronous. That way, the execution will be blocked till ajax call returns:

$.ajax({
    url: sURL + 'myController/myInsert',
    type:"POST",
    dataType: 'text',
    data: {'rn': rn},
    async: false,
    success: function(data) {
        //not sure what to do on success.
    }
});

Upvotes: -1

Explosion Pills
Explosion Pills

Reputation: 191729

function myLoop() {
   var jqxhrs = [];
   if( $(this).prop('checked') ){ 
       var rn = $(this).prop('value'); 
       jqxhrs.push($.ajax({...
   }
   return jqxhrs;
}

function () {
   $.when.apply(undefined, myLoop()).done(function () {
      $.ajax({
         url: sURL + "myController/myMethod",
         ...
   });
}

$.when.apply is used to call $.when on the array of ajax requests, so .done is not called until they are all complete.

Upvotes: 2

Dimitar Dimitrov
Dimitar Dimitrov

Reputation: 15138

You can use the $.when function that has been added to jQuery.

It goes something like this:

   $.when(ajaxFunction1(), ajaxFunction1()).done(function(response1, response2){
    // when the function calls are done this code here will be executed -> the response will be passed as parameters corresponding to the functions -> response1, response2
   });

Or you can try to use "beforeSend" within the ajax function:

$.ajax({
   beforeSend: function(){    
     alert("doing stuff before the ajax call ...");    
   },
   success: function(){    
    alert("Whoa!");    
   }
 });

Upvotes: 2

Related Questions