I've tried lots of solutions including How should I call 3 functions in order to execute them one after the other? and Proper Way to Make API Fetch 'POST' with Async/Await but none worked for me.
In my application, I want to fetch data from various APIs into HTML inputs. First I fetch regions, categories, and sectors. Because these 3 fields are select inputs, I set their select options with the returned data. Then I fetch organization details to fill the other text input fields. Problem is that, code that sets the values for the inputs do not wait for all data fetching to be complete so it sometimes returns undefined
My code is
async function loadData() {
var organisation_id = document.getElementById("organisation_id").innerText;
console.log("Fetching sectors")
// Fetch sectors
let fetchSectors = await fetch("/get-organisation-sectors");
let sectorsData = await fetchSectors.json();
var sectors = sectorsData;
var $sectorselect = $("#sector");
$sectorselect.html('<option value=""> Choose... </option>');
$.each(sectors, function (key, val) {
$sectorselect.append(
'<option value="' + val.sector_name + '">' + val.sector_name + "</option>"
);
});
// Done fetching sectors
console.log("Fetching categories")
// Fetch categories
let fetchCategories = await fetch("/get-organisation-categories");
let categoriesData = await fetchCategories.json();
var categories = categoriesData;
var $categoryselect = $("#category");
$categoryselect.html('<option value=""> Choose... </option>');
$.each(categories, function (key, val) {
$categoryselect.append(
'<option value="' + val.category_name +'">' + val.category_name + "</option>"
);
});
// Done fetching categories
console.log("Fetching regions")
// Fetch regions
let fetchRegions = await fetch("http://apis.bigdataghana.com/get_regions");
let regionsData = await fetchRegions.json();
var regions = regionsData;
var $regionselect = $("#region");
$regionselect.html('<option value=""> Choose... </option>');
$.each(regions, function (key, val) {
$regionselect.append(
'<option value="' + val.region + '">' + val.region + "</option>"
);
});
// Done fetching regions
console.log("Fetching organisation details")
// Fetch organisation details
let fetchOrganisationData = await fetch("/get-organisation-details/" + organisation_id);
let organisationDetailsData = await fetchOrganisationData.json();
organisationData = organisationDetailsData[0];
return await organisationData;
}
loadData().then((data) => {
setValues(data);
}).catch(e => console.log(e));
The function that sets the values is
function setValues(organisationData) {
$("#organisation_name").val(organisationData.name);
$("#email").val(organisationData.email);
$("#phone").val(organisationData.phone);
$("#website").val(organisationData.website);
$("#locality").val(organisationData.locality);
$("#address").val(organisationData.address);
$("#latitude").val(organisationData.latitude);
$("#longitude").val(organisationData.longitude);
$(function () {
$("#category").val(organisationData.category);
});
$(function () {
$("#sector").val(organisationData.sector);
});
$(function () {
$("#region").val(organisationData.region);
});
var $districtselect = $("#district");
$districtselect.html('<option value=""> Choose... </option>');
$districtselect.append(
'<option value="' +
organisationData.district +
'">' +
organisationData.district +
"</option>"
);
$(function () {
$("#district").val(organisationData.district);
});
}