Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I resend a failed ajax request?

I have multiple ajax requests some request data every minute others are initiated by the user through a ui.

$.get('/myurl', data).done(function( data ){
   // do stuff..
});

The request might fail due to an authentication failure. I've setup a global .ajaxError() method for catching any failed requests.

$(document).ajaxError(function( e, jqxhr ){
   // Correct error..
});

After I catch the error I reset authorization. Resetting the authorization works but the user has to manually re initiate the ajax call (through the ui).

How do I resend the failed request using the jqxhr originally sent?

(I'm using jQuery for the ajax)

like image 655
hitautodestruct Avatar asked Jan 16 '12 14:01

hitautodestruct


1 Answers

Found this post that suggests a good solution to this problem.

The main thing is to use $.ajaxPrefilter and replace your error handler with a custom one that checks for retries and performs a retry by using the closure's 'originalOptions'.

I'm posting the code just in case it will be offline in the future. Again, the credit belongs to the original author.

// register AJAX prefilter : options, original options
$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {

   originalOptions._error = originalOptions.error;

   // overwrite error handler for current request
   options.error = function( _jqXHR, _textStatus, _errorThrown ){

   if (... it should not retry ...){

         if( originalOptions._error ) originalOptions._error( _jqXHR, _textStatus, _errorThrown );
         return;
      };

      // else... Call AJAX again with original options
      $.ajax( originalOptions);
   };
});
like image 146
Shai Reznik - HiRez.io Avatar answered Oct 14 '22 19:10

Shai Reznik - HiRez.io