Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Метод восстановления функций JScript-объекта после извлечения его из ASP Session object. 19.07.12 16:08
Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 19.07.12 16:24 Количество правок: 8
|
Часто мелкие web-проекты не имеет смысла ваять на ASP.NET, многие предпочитают использовать классический ASP.
Простые переменные сессии пользователя сохраняют в ASP Session object, из которого их потом можно почитать по предоставленному во время записи наименованию.
На сервере специально стал использовать в ASP скриптах MS JScript, потому что ну наверное хорошо, что один и тот же язык можно использовать как в браузере на клиентской стороне, так и на сервере, не нужно каждый раз "переключать мозги".
И вот, JScript объекты прекрасно сохранялись в сессии и извлекались оттуда... пока они были простых встроенных прототипов -- ну там Number, Date, String и т.п. Даже если у объекта простые поля — поля читались без проблем. Проблемы возникли, когда у объекта появились методы. Объект извлекался, но при попытке исполнения его метода возникала ошибка "Не удается выполнить программу из освобожденного сценария", хотя сценарий с описанием объекта прогружался перед чтением объекта из сессии. После небольших исследований выяснилось, что прототип у метода не является объектом Function. Попытка узнать, что это за объект не давала результатов — обращение к prototype метода тоже вызывало ошибку, хотя чтение typeof(наш "ущербный" метод) исправно выдавало "function".
В общем, приделал ко всем сохраняемым в сессии сложным объектам конструктор, который если замечает, что в него передали параметр, тупо копирует в создаваемый объект все поля из "ущербного", при этом не прикасаясь к функциям. Приведу пример кода, может кому пригодится.
if (fromOrphaned) {
for (each in fromOrphaned) {
if (typeof(fromOrphaned[each]) != "function") {this[each] = fromOrphaned[each]}
}
} ---
Как это работает? Поскольку мы сохраняли свой объект, то знаем, какого он должен быть типа. После извлечение объекта из сессии, посылаем его параметром в конструктор его типа, а потом пользуемся новым "пролеченным" объектом без проблем, старый уже не нужен, свои поля он передал новому.
Всем удачного извлечения жабаскриптовых объектов из сессий! :-)
|
|
|