I want to return the state of o from waitState once the state has changed from false to true. I can't see how not to return immediately :
https://jsfiddle.net/msLzovch/1/
o = {
state: false
}
async function waitState() {
let timerId = setInterval(checkState, 1000);
function checkState() {
if (o.state == true) {
clearInterval(timerId);
}
}
return o.state; // wrong here
}
function theEnd() {
o.state = true;
}
setTimeout(theEnd, 5000);
async function main() {
let state = await waitState();
alert(state);
}
main();
Your code doesn't work as you expect because there is nothing preventing the funcion waitState() from returning a value immediately. setInterval() will just return an id that will be stored in timerId and o.state is accessible.
But you don't need to have a loop reading the variable, you can override the object's set method:
const o = {
state: false
}
Object.defineProperty(o, 'state', {
set: (value) => {
this.state = value
// call your custom function
}
})
o.state = true // your custom function will be called
You can use a promise:
o = {
state: false
}
async function waitState() {
return new Promise(resolve => {
let timerId = setInterval(checkState, 1000);
function checkState() {
if (o.state == true) {
clearInterval(timerId);
resolve(o.state);
}
}
});
}
function theEnd() {
o.state = true;
}
setTimeout(theEnd, 5000);
async function main() {
let state = await waitState();
alert(state);
}
main();