Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Уничтожить обьект


Автор: Kefir 27.4.2008, 15:53
В общем так. Есть класс Timeline (cделанный при помощи mootools). Это "временная прямая", на которой есть события. При каждом событии осуществляется fireEvent('onSwitch', eventId). Так вот, с определённой периодичностью скрипт обновляет расписание эвентов (получает Json от ПХП скрипта) - ф-ции запроса и обработки ответа следующие:
Код

                requestData: function () {
                    jsonRequest = new Json.Remote(this.options.jsonUrl, {onComplete: this.handleData}).send();
                },
                handleData: function(data) {
                    this.jsonData = data;                    
                    this.timeline = null;
                    this.timeline = new Timeline({switches: this.jsonData['switches']});
                },

Как видите, всё просто с каждым ответом я создаю новый Timeline с обновлёнными switches (они же эвенты). Так вот проблема в том что я то новый таймлайн создаю, а старые где то там ещ остаются и тоже стреляют свои эвенты. Вопрос - что с ними сделать? delete this.timeline пробовал, this.timeline = null пробовал - не помогают. или нельзя стирать обьекты вообще?

Автор: Itsys 27.4.2008, 17:11
Насколько я понимаю, для хранения и вызывания event-ов, используется какой-то конкретный объект в DOM модели, и присваивание ссылке на timeline null не удаляет этот объект, и, соответственно, надо в DOM отдельно заниматься удалением созданных при инициализации (new Timeline) объектов.

ЗЫ Не смотрел библиотеку mootools, так что это только предположение.
ЗЗЫ Посмотри, может они предусмотрели функцию-дестроер объекта, которую можно вызвать как-то так: this.timeline.destroy();

Автор: SelenIT 27.4.2008, 22:07
Цитата(Kefir @  27.4.2008,  15:53 Найти цитируемый пост)
расписание эвентов

Если я верно понимаю, "расписание" это фактически устанавливает массив таймаутов? Тогда перед обnullением объекта надо бы пройтись по этим таймаутам и отclearTimeoutить их...

Автор: Itsys 27.4.2008, 22:18
Цитата(SelenIT @  27.4.2008,  22:07 Найти цитируемый пост)
это фактически устанавливает массив таймаутов

Будет фигово, если это вообще не массив, а просто задание таймаутов без внесения их в массив, тогда их фиг уберешь. smile 
Kefir, вообще надо смотреть, что присходит при инициализации объекта Timeline.

Автор: Kefir 27.4.2008, 23:28
SelenIT, почти. на каждом эвенте ставится таймаут на следующий эвент, дабы не ставить много таймаутов. только суть вопроса не в этом - я понимаю, что JS - язык странный и не похожий на другие, но вот скажите - есть у меня обьект, у него свои переменные, свои эвенты какие то, на эти эвенты подписываются другие объекты. так вот вопрос - можно ли как то элиминировать этот обьект? я не спрашиваю можно ли сделать clearTimeout для каждого setTimeout - я и так знаю что это можно сделать. я спрашиваю есть ли способ полностью удалить / уничтожить / сжечь / трансклюкировать обьект (переменную)?


Цитата(Itsys @  27.4.2008,  17:11 Найти цитируемый пост)
this.timeline.destroy(); 

это было первое что я проверил В)

Автор: Itsys 27.4.2008, 23:45
Цитата(Kefir @  27.4.2008,  23:28 Найти цитируемый пост)
что JS - язык странный и не похожий на другие

Это не язык странный, а работа с объектами у него такая - при обнулении объекта - ты уничтожаешь все его внутренние переменные, но setTimeout запускается и исполняется не внутри объекта, а в глобальной области, в объекте хранится только ссылка на переменную (если вообще хранится), которая "уничтожает" setTimeout с помошью функции clearTimeout, при обнулении этой переменной остановка setTimeout не проиходит - поэтому единственный способ его остановить - это перед обнулением объекта послать команду на остановку. Тоже самое происходит при создании элементов внутри объекта, например функцией createElement, и добавлении их в DOM.

Автор: MoZy 1.5.2008, 20:47
Может при обнулении диструктор вызывается?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)