I am making several asynchronous ajax calls which must be executed in a specific order and which must pass information to each other. Here is a MWE of my current approach. Even with three API calls it is a bit of a nightmare. With 5 it’s impossible to line up the error workflow or to move functions around (also I run out of screen space). Is there a better approach to achieve this same outcome?
/* * API Call to get user */ $.ajax({ type: 'POST', url: `robin.hood/get_user`, data: JSON.stringify({"name":"Joe Dirt"}), headers: {Authorization: 'Bearer ' + token}, datatype: 'json', contentType: 'application/json; charset=utf-8', success: function (data, text_status, jq_xhr) { /* * Assume one user is returned only */ let user_id = data; /* * API Call to get the bank balance of the user */ $.ajax({ type: 'POST', url: `robin.hood/get_user_balance`, data: JSON.stringify({"user_id":user_id}), headers: {Authorization: 'Bearer ' + token}, datatype: 'json', contentType: 'application/json; charset=utf-8', success: function (data, text_status, jq_xhr) { /* * We record the balance */ let balance = data; /* * We invest in Gamestop stock */ $.ajax({ type: 'POST', url: `robin.hood/buy_gamestop_stock`, data: JSON.stringify({"user_id":user_id, "amount":balance}), headers: {Authorization: 'Bearer ' + token}, datatype: 'json', contentType: 'application/json; charset=utf-8', success: function (data, text_status, jq_xhr) { /* STONKS!!! */ }); }, error: function (jq_xhr, text_status, error_thrown) { /* NO STONKS */ } }); }, error: function (jq_xhr, text_status, error_thrown) { /* NO STONKS */ } }); }, error: function (jq_xhr, text_status, error_thrown) { /* NO STONKS */ } });
Related but not so clear questions:
- Chaining multiple jQuery ajax requests
- jquery how to use multiple ajax calls one after the end of the other
Advertisement
Answer
$.ajax
returns a Thenable, which means you can await
it inside an async
function, which is easier to manage than nested callbacks:
async function run() { try { const user = await $.ajax({ type: 'POST', url: `robin.hood/get_user`, data: JSON.stringify({ "name": "Joe Dirt" }), headers: { Authorization: 'Bearer ' + token }, datatype: 'json', contentType: 'application/json; charset=utf-8', }) const balance = await $.ajax({ // ... }) const data = await $.ajax({ // ... }) /* STONKS!!! */ } catch (e) { /* NO STONKS */ } } run()