Я хочу заставить программу JavaScript ждать в некоторых точках ее выполнения до тех пор, пока переменная не изменится. Есть ли способ сделать это? Я уже нашел расширение, которое называется «описательный JavaScript», заставляющее программу ждать, пока событие не произойдет. Есть ли способ создать новое событие - событие с переменным изменением, например, которое ведет себя как событие onclick.Как я могу заставить программу ждать изменения переменной в javascript?
ответ
Нет, вам не придется создавать собственное решение. Как и с использованием шаблона проектирования Observer или чего-то еще.
Если у вас нет контроля над переменной или кто ее использует, я боюсь, что вы обречены. EDIT: Или используйте решение Skilldrick!
Майк
быстрое и простое решение выглядит следующим образом:
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, например:
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();
}
}
И тогда вы можете сделать объект из него, который будет содержать значение, которое вы хотите контролировать, а также функцию, которая будет вызываться, когда значение приобретает изменилось. Например, если вы хотите быть предупреждены при изменении значения и начальное значение 10, можно было бы написать такой код:
var myVar = new Variable(10, function(){alert("Value changed!");});
Handler function(){alert("Value changed!");}
будет называться (если вы посмотрите на код), когда SetValue()
является называется.
Вы можете получить значение следующим образом:
alert(myVar.GetValue());
Вы можете установить значение следующим образом:
myVar.SetValue(12);
И сразу же после этого, предупреждение будет отображаться на экране. Посмотрите, как это работает: http://jsfiddle.net/cDJsB/
Спасибо за ответ, но это не совсем то, что я хочу. Посмотрите мой комментарий на aularon, пожалуйста! –
Условные обозначения для JavaScript однопоточные, поэтому переменная не может меняться, когда код ожидает в каком-то другом коде, который не меняет эту переменную.
По моему мнению, было бы лучшим решением для переноса переменной в объект какого-либо объекта, который имеет функцию getter и setter. Затем вы можете зарегистрировать функцию обратного вызова в объекте, который вызывается при вызове функции setter объекта. После этого вы можете использовать функцию геттер в функции обратного вызова для получения текущего значения:
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>
Наверное, лучшее решение, если у вас есть контроль над исходной переменной. – Skilldrick
Спасибо за ответ, но это не совсем то, что я хочу. Посмотрите мой комментарий на aularon, пожалуйста! –
Как я уже говорил, интерпретаторы JavaScript однопоточные. Вы не можете заблокировать поток и заставить его ждать, пока какой-нибудь другой поток изменит переменную, потому что нет другого потока, который может изменить переменную. Обработчик событий JavaScript не может выполняться, а другой уже выполняется. – Reboot
Вы можете использовать свойства:
Object.defineProperty MDN documentation
Пример:
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
- 1. Как я могу заставить программу ждать нажатия кнопки в javascript?
- 2. Как я могу заставить свою программу ждать TouchEvent в Android
- 3. Как заставить swing-программу ждать
- 4. Как заставить программу ждать метода в java
- 5. Как заставить программу ждать завершения HTTP-запроса в JavaScript?
- 6. Как заставить мою программу ждать ввода клавиатуры?
- 7. Как заставить программу C ждать (на Linux)?
- 8. Могу ли я заставить разрешение обещания ждать результатов в javascript?
- 9. Как я могу заставить python ждать, пока я закончу разговор?
- 10. Javascript ждать переменной
- 11. Как я могу заставить эту программу работать?
- 12. Как заставить PHP ждать инициализации переменной?
- 13. Как я могу заставить свою программу ждать ввода, не находясь в цикле
- 14. Как я могу заставить браузер видеть изменения CSS и Javascript?
- 15. Как заставить программу ждать блокировки в базе данных sqlite
- 16. Как я могу ждать программу, используя таймер? C#
- 17. gtkmm, как я могу заставить свою программу ждать нажатия нажатой кнопки?
- 18. Как я могу заставить Protractor НЕ ждать $ timeout?
- 19. Как я могу заставить узел ждать? или, возможно, другое решение?
- 20. Как я могу заставить этот jquery ждать завершения события click?
- 21. Как я могу заставить мой скрипт ждать завершения анимации jQuery?
- 22. Как заставить webdriver ждать
- 23. Как заставить эту программу ждать нажатия экрана перед запуском?
- 24. Как заставить программу WinForms ждать (например, для нажатия «enter»)?
- 25. Как заставить программу ждать, пока команда не будет выполнена
- 26. Как заставить программу ждать щелчка мыши, прежде чем продолжить
- 27. Как я могу заставить программу получить переменную внутри цикла? (java)
- 28. Как я могу оптимизировать свою программу javascript?
- 29. WP7 Developpement: Как заставить программу ждать до конца EventHandler?
- 30. Как я могу сбросить программу Javascript?
отредактированный сейчас, он проверяет каждые 50 мс и работает для non-bools.это, как я сказал, быстрый и простой способ сделать это, перейдите по этой ссылке: http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers (уже добавлено @mplungjan) для более углубленное решение проблем. – aularon
Я думаю, вы имели в виду 'something === something_cachedValue'. Затем он работает: http://jsfiddle.net/pEnYC/ – Skilldrick
@Skilldrick, да, я имел в виду это, я исправил его. Спасибо за исправление:) – aularon