I have a JavaScript function that makes two consecutive Ajax requests using jQuery. I want to make sure that the first request has loaded before the second function is called. Is there a way I can do this?
-
1Is it the second *Ajax* call that needs to wait until the first one has returned, or the second *callback* that needs to wait? (i.e. do you need to wait before firing off the second ajax request, or can both be fired off one after the other, but you want to make sure that if the second one returns first, its callback is blocked until the first one returns) – Graza Jan 04 '10 at 23:34
-
The 2nd function should not be fired until the first has completed. The 1st function creates a form element and the 2nd takes that form value and makes some calculations based on it. – Brian Jan 04 '10 at 23:43
9 Answers
Either specify async: false
in the $.ajax
options, or make the second ajax call in the complete
callback of the first call.

- 66,414
- 68
- 253
- 406
-
-
-
`async: false` works great. The order in which I call the two functions varies, so it's much preferred to the callback method. – Brian Jan 04 '10 at 23:38
$.post("script1.php", {data:"val"}, function(response) {
$.post("script2.php", {data:response}, function(results) {
// this second call will be initialized when the first finishes
});
});

- 265,109
- 74
- 539
- 565
Using jQuery the simplest way is like this:
$.ajax({
type: "POST",
url: "some.php",
success: function(msg){
$.ajax({
type: "POST",
url: "some2.php",
success: function(msg){
alert( "End of second call" );
}
});
}
});

- 102,349
- 23
- 137
- 192
In your callback for the first function, make your second call.

- 187,200
- 47
- 362
- 445
For best results you should probably invoke the second function in the callback of the first.
For Example:
$.post("http://www.somewebsite.com/page.php", function(data) {
// whatever
function2();
});

- 24,423
- 19
- 99
- 156
An example implementation:
function callback() {$('div#second_ajax_output').load('http://www.google.com');}
$('div#first_ajax_output').load('http://www.yahoo.com',callback);

- 17,796
- 13
- 66
- 118
Since jQuery requests return thenables, in modern browsers, you can await
each call. For example:
async function fetchBoth() {
const todo1 = await $.get('https://jsonplaceholder.typicode.com/todos/1');
const todo2 = await $.get('https://jsonplaceholder.typicode.com/todos/2');
}
fetchBoth();
async function fetchBoth() {
console.log('start 1');
const todo1 = await $.get('https://jsonplaceholder.typicode.com/todos/1');
console.log('got todo1', todo1);
console.log('start 2');
const todo2 = await $.get('https://jsonplaceholder.typicode.com/todos/2');
console.log('got todo2', todo2);
}
fetchBoth();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Don't use async: false
. Synchronous ajax requests are deprecated and should not be used; if used, users will probably see console warnings as a result.
Note that this use of await
works just fine for any sort of Promise, not ajax requests, and not just jQuery. For example:
async function fetchBoth() {
console.log('start 1');
const todo1 = await fetch('https://jsonplaceholder.typicode.com/todos/1').then(res => res.json());
console.log('got todo1', todo1);
console.log('start 2');
const todo2 = await fetch('https://jsonplaceholder.typicode.com/todos/2').then(res => res.json());
console.log('got todo2', todo2);
}
fetchBoth();

- 356,069
- 52
- 309
- 320
Edit: Misread the question; my bad. If you ever want to have two AJAX requests executed concurrently but run a callback only after both have finished, this is how you do it!
Try this:
var completedCount = 0;
var callback = function()
{
completedCount++;
if (completedCount == 2)
{
// Do something.
}
};
$.post('url-1', {}, callback);
$.post('url-2', {}, callback);

- 32,488
- 9
- 84
- 95