Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make all AJAX calls sequential?

I use jQuery. And I don't want parallel AJAX calls on my application, each call must wait the previous before starting. How to implement it? There is any helper?

UPDATE If there is any synchronous version of the XMLHttpRequest or jQuery.post I would like to know. But sequential != synchronous, and I would like an asynchronous and sequential solution.

like image 705
Jader Dias Avatar asked Jul 20 '09 03:07

Jader Dias


People also ask

Can AJAX be made synchronous?

AJAX can access the server both synchronously and asynchronously: Synchronously, in which the script stops and waits for the server to send back a reply before continuing. Asynchronously, in which the script allows the page to continue to be processed and handles the reply if and when it arrives.

How do I handle multiple AJAX requests?

The jQuery library provides a way to make any callback function waiting for multiple Ajax calls. This method is based on an object called Deferred. A Deferred object can register callback functions based on whether the Deferrred object is resolved or rejected. Here is an example of the Deferred object.

Are AJAX calls asynchronous by default?

Yup. Ajax calls are asynchronous by nature and defaults to true. Show activity on this post. By default, all requests are sent asynchronously (i.e. this is set to true by default).


2 Answers

There's a much better way to do this than using synchronous ajax calls. Jquery ajax returns a deferred so you can just use pipe chaining to make sure that each ajax call finishes before the next runs. Here's a working example with a more in depth example you can play with on jsfiddle.

// How to force async functions to execute sequentially  // by using deferred pipe chaining.  // The master deferred. var dfd = $.Deferred(),  // Master deferred     dfdNext = dfd; // Next deferred in the chain     x = 0, // Loop index     values = [],       // Simulates $.ajax, but with predictable behaviour.     // You only need to understand that higher 'value' param      // will finish earlier.     simulateAjax = function (value) {         var dfdAjax = $.Deferred();          setTimeout(             function () {                 dfdAjax.resolve(value);             },             1000 - (value * 100)         );          return dfdAjax.promise();     },      // This would be a user function that makes an ajax request.     // In normal code you'd be using $.ajax instead of simulateAjax.     requestAjax = function (value) {         return simulateAjax(value);     };  // Start the pipe chain.  You should be able to do  // this anywhere in the program, even // at the end,and it should still give the same results. dfd.resolve();  // Deferred pipe chaining. // What you want to note here is that an new  // ajax call will not start until the previous // ajax call is completely finished. for (x = 1; x <= 4; x++) {      values.push(x);      dfdNext = dfdNext.pipe(function () {         var value = values.shift();         return requestAjax(value).             done(function(response) {                 // Process the response here.              });      });  } 

Some people have commented they have no clue what the code does. In order to understand it, you first need to understand javascript promises. I am pretty sure promises are soon to be a native javascript language feature, so that should give you a good incentive to learn.

like image 80
Todd Chaffee Avatar answered Sep 29 '22 08:09

Todd Chaffee


You have two choices that I can think of. One is to chain them through callbacks. The other is to make the calls synchronous rather than async.

Is there a reason you want them sequential? That will slow things down.

To make the call synchronous, you'll set the async option in the Ajax call to false. See the documentation at http://docs.jquery.com/Ajax/jQuery.ajax#options (click options tab to see them).

like image 27
Nosredna Avatar answered Sep 29 '22 08:09

Nosredna