How can I make a program wait for a variable change in javascript? How can I make a program wait for a variable change in javascript? javascript javascript

How can I make a program wait for a variable change in javascript?


Edit 2018: Please look into Object getters and setters and Proxies. Old answer below:


a quick and easy solution goes like this:

var something=999;var something_cachedValue=something;function doStuff() {    if(something===something_cachedValue) {//we want it to match        setTimeout(doStuff, 50);//wait 50 millisecnds then recheck        return;    }    something_cachedValue=something;    //real action}doStuff();


JavaScript interpreters are single threaded, so a variable can never change, when the code is waiting in some other code that does not change the variable.

In my opinion it would be the best solution to wrap the variable in some kind of object that has a getter and setter function. You can then register a callback function in the object that is called when the setter function of the object is called. You can then use the getter function in the callback to retrieve the current value:

function Wrapper(callback) {    var value;    this.set = function(v) {        value = v;        callback(this);    }    this.get = function() {        return value;    }  }

This could be easily used like this:

<html><head><script type="text/javascript" src="wrapper.js"></script><script type="text/javascript">function callback(wrapper) {    alert("Value is now: " + wrapper.get());}wrapper = new Wrapper(callback);</script></head><body>    <input type="text" onchange="wrapper.set(this.value)"/></body></html>


I would recommend a wrapper that will handle value being changed. For example you can have JavaScript function, like this:

function Variable(initVal, onChange){    this.val = initVal;          //Value to be stored in this object    this.onChange = onChange;    //OnChange handler    //This method returns stored value    this.GetValue = function()      {        return this.val;    }    //This method changes the value and calls the given handler           this.SetValue = function(value)    {        this.val = value;        this.onChange();    }}

And then you can make an object out of it that will hold value that you want to monitor, and also a function that will be called when the value gets changed. For example, if you want to be alerted when the value changes, and initial value is 10, you would write code like this:

var myVar = new Variable(10, function(){alert("Value changed!");});

Handler function(){alert("Value changed!");} will be called (if you look at the code) when SetValue() is called.

You can get value like so:

alert(myVar.GetValue());

You can set value like so:

myVar.SetValue(12);

And immediately after, an alert will be shown on the screen. See how it works: http://jsfiddle.net/cDJsB/