我怎样才能让一个程序等待在JavaScript中的variables更改?

我想强制JavaScript程序在执行的某些特定点上等待,直到variables发生变化。 有没有办法做到这一点? 我已经find了一个名为“叙述性JavaScript”的扩展,强制程序等待事件发生。 有没有办法创build一个新的事件,例如“变化的事件”,就像onclick事件..

一个快速和容易的解决scheme是这样的:

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解释器是单线程的,所以当代码在其他一些不改变variables的代码中等待时,variables永远不会改变。

在我看来,将这个variables包含在某种具有getter和setter函数的对象中是最好的解决scheme。 然后,可以在调用对象的setter函数时调用的对象中注册callback函数。 然后,您可以在callback中使用getter函数来检索当前值:

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

这可以很容易地使用像这样:

 <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> 

我会build议一个包装,将处理价值正在改变。 例如,您可以拥有JavaScriptfunction,如下所示:

 ​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(); } } 

然后你可以创build一个对象来保存你想要监视的值,也可以创build一个当值被改变时调用的函数。 例如,如果要在值更改时收到警报,初始值为10,则可以这样编写代码:

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

当调用SetValue()时,Handler function(){alert("Value changed!");}将被调用(如果您查看代码)。

你可以像这样获得价值:

 alert(myVar.GetValue()); 

你可以像这样设置值:

 myVar.SetValue(12); 

之后,屏幕上会显示警报。 看看它是如何工作的: http : //jsfiddle.net/cDJsB/

你可以使用porperties

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

例:

 function def(varName, onChange) { var _value; Object.defineProperty(this, varName, { get: function() { return _value; }, set: function(value) { if (onChange) onChange(_value, value); _value = value; } }); return this[varName]; } def('myVar', function (oldValue, newValue) { alert('Old value: ' + oldValue + '\nNew value: ' + newValue); }); myVar = 1; // alert: Old value: undefined | New value: 1 myVar = 2; // alert: Old value: 1 | New value: 2 

不,您将不得不创build自己的解决scheme。 就像使用Observerdevise模式什么的。

如果你无法控制variables或使用它,恐怕你注定了。 编辑:或使用Skilldrick的解决scheme!

麦克风