У меня есть конструктор, который я создал, который имеет метод, который модифицирует кучу локальных переменных. Моя проблема в том, что метод может вызвать некоторую ошибку, поэтому, когда возникает ошибка, я хочу восстановить область до ее предыдущего состояния. Очевидно, я мог бы создать кучу временных переменных, а затем просто назначить их переменным, которые фактически использует конструктор, но это не совсем оптимальное решение. Я хочу знать, есть ли способ изменить переменные из метода и восстановить их до состояния, которое они были до того, как метод был вызван в случае ошибки.Отменить изменения в области конструктора при ошибке
ответ
Помимо глобального охвата, нет реального способа взаимодействия с областями в JavaScript. Тем не менее вы можете создавать объекты, которые действуют как области.
demo
function Scope(data){
this.data = data;
this.stages = [];
this.save(data);
}
Scope.prototype.save = function(){
var oldData = JSON.parse(JSON.stringify(this.data));
this.stages.push(oldData);
}
Scope.prototype.undo = function(){
var lastData = this.stages.pop();
this.data = lastData;
}
Затем мы можем создать область с некоторыми данными.
var scope = new Scope({name: "John"});
Теперь у нас есть странная функция с очень предпочтительным отношением к людям по имени Пол.
function myFunction(data) {
if (data.name === "John") {
data.name = "Paul";
throw new Error("I don't like John!");
}
}
Затем мы можем позвонить нашей функции в попытке/уловить.
try {
myFunction(scope.data);
}
catch (e) {
// scope.data is {name: "Paul"}
scope.undo();
// scope.data is {name: "John"}
}
использование стек,
например.
var Stack = new Array();
doModification(10,'');
function doModification(A,B){
Stack.push(A);
Stack.push(B);
// after modifying,
try{
A= 10;
if(B == 0) throw new Error("Divide by Zero Exception.");
B= A/B;
}
catch(e){
// if exception then restore original vars
B = Stack.pop();
A = Stack.pop();
alert(e.description);
}
// else if error doesn't come then, clear the stack
Stack = [];
}
Просто, чтобы вы знали, '10/0' не выдает ошибку. Это [приводит к 'Infinity'] (http://jsfiddle.net/4T5EJ/). – FakeRainBrigand
@fakeRainBrigand - он будет кидать - «делить на нулевое исключение» – sourcecode
На некоторых языках, но не на JavaScript, кроме, может быть, на старых браузерах. [Пример] (http://jsfiddle.net/4T5EJ/). Firefox и Chrome дают Infinity. – FakeRainBrigand
- 1. Отменить код изменения области в Perl
- 2. Ошибка при попытке отменить изменения в объекте
- 3. Отменить изменения в массивеList
- 4. Отменить изменения в git
- 5. Ошибка при подключении или ошибке конструктора ML
- 6. Как отменить/отменить изменения, внесенные в модель?
- 7. Отменить изменения в listview onbackpressed
- 8. Отменить изменения полей в Scintilla
- 9. Отменить нажатые изменения в файл
- 10. Grunt отменить мои изменения при перезагрузке
- 11. Нежелательные изменения формы при использовании конструктора VS
- 12. Как отменить удаление в локальной рабочей области TFS
- 13. Jaydata отменить ожидающие изменения
- 14. Как отменить изменения SVN ..?
- 15. Отменить изменения файла в фиксации
- 16. Отменить локальные изменения в ископаемых
- 17. Программно отменить изменения в DataForm
- 18. Git отменить изменения в хранилище
- 19. Отменить изменения в EditLabel wxtreectrl
- 20. Отменить изменения в магазине redux
- 21. Отменить последние изменения в Git
- 22. Отменить изменения в контейнере докеров
- 23. Отменить изменения в моем случае
- 24. Как отменить изменения в форме?
- 25. Невозможно отменить изменения htaccess
- 26. Как «отменить» изменения формы?
- 27. Как отменить изменения?
- 28. Отменить ожидающие изменения
- 29. Отменить отброшенные незафиксированные изменения
- 30. Как отменить изменения каркаса?
Таким образом, вы хотите создать резервную копию некоторых переменных, но сохранение исходных значений «не оптимально». Как вы предлагаете восстановить, если вы не создали резервную копию в первую очередь? –
«но это не оптимальное решение». Вы имеете в виду, что это не оптимально, потому что * вы должны сделать разматывание стека? Если да, не используйте JavaScript (или большинство языков, если на то пошло). Если вы пишете для браузера, не стесняйтесь использовать один из многих языков программирования 'call/cc' на стороне браузера, которые не существуют. В противном случае просто используйте LISP. –
Хороший случай для шаблона Memento :) –