Can someone explain to me why this is not working the way I am expecting?
I am expecting the last console.log to run after my functions run, but it is returning empty length string instead of the actual date.
These are the variables I want to set after my function call. Declaring them now so the scope is set globally.
var seasonStart = ''; var seasonID = '';
This function gets my json data. I have URL declared above in my code, its returning everything as expected.
async function getCurrentSeasonapi(url) { //store response const response = await fetch(url); //store data in JSON var data = await response.json(); //I tried to set the variables here but it didn't work so I tried using a separate function setSeasonInfo(data); }
The function that is called above:
//set current season function setSeasonInfo(data) { seasonStart = data.seasons[0].regularSeasonStartDate; seasonID = data.seasons[0].seasonId; //this returns the correct date console.log(seasonStart); }
calling the function, so my variables should be set correctly after this function runs
getCurrentSeasonapi(getCurrentSeasonURL); //this is returning '' instead of the actual date set in the function console.log(seasonStart);
I’m thinking this is a scope issue but I’m not sure why. Here is an example that I was testing the scope out on. This is how I was expecting my code to run:
var test = 1; async function changeTest() { test =100; } document.getElementById("first").innerHTML = test + `<br>` + 'Run Function:' + `<br>`; changeTest(); document.getElementById("first").innerHTML += test
<html> <body> <p> testing JS execution</p> <div id = 'first'> </div> </body> </html>
Advertisement
Answer
You are not awaiting the call. The example code should have a promise in it.
var testSync = 1; var testAsync = 1; async function changeTest() { testSync = 100; await new Promise((resolve, reject) => { setTimeout(() => { testAsync = 100; resolve(); }, 300); }); } document.getElementById("first").innerHTML = `${testSync} - ${testAsync} <br> Running <br>`; changeTest(); document.getElementById("first").innerHTML += `${testSync} - ${testAsync}`
<html> <body> <p> testing JS execution</p> <div id='first'> </div> </body> </html>
Now with it awaiting the call
var testSync = 1; var testAsync = 1; async function changeTest() { testSync = 100; await new Promise((resolve, reject) => { setTimeout(() => { testAsync = 100; resolve(); }, 300); }); } (async function() { document.getElementById("first").innerHTML = `${testSync} - ${testAsync} <br> Running <br>`; await changeTest(); document.getElementById("first").innerHTML += `${testSync} - ${testAsync}` }());
<html> <body> <p> testing JS execution</p> <div id='first'> </div> </body> </html>