Серверный JavaScript 1.4. Руководство по использованию

       

Создание Специального Объекта client


Как уже было сказано ранее, свойства предопределённого объекта client могут иметь только строковые значения. Это ограничение может представлять проблему для работы некоторых приложений. Например, Вашему приложению нужен объект, который существует столько же, сколько предопределённый объект client, но который может принимать в качестве значений свойств объекты или другие типы данных. В этом случае Вы можете создать Ваш собственный объект и сохранить его как свойство объекта client.

В этом разделе приведён пример создания такого объекта. Можете включить этот код как файл JavaScript в Ваше приложение. Затем в начале страницы, на которой нужно использовать этот объект, введите следующий оператор:

var customClient = getCustomClient()

(Разумеется, можно использовать другое имя переменной.) Если это первая страница, запрашивающая данный объект, метод getCustomClient создаёт новый объект. На других страницах он будет возвращать уже существующий объект.

Этот код сохраняет массив всех специальных объектов client, определённых в приложении как значения свойства customClients предопределённого объекта project. Он сохраняет индекс в этом массиве и строковое значение свойства customClientID предопределённого объекта client. Кроме того, этот код использует блокировку/lock, хранимую в свойстве customClientLock объекта project, чтобы гарантировать надёжность доступа к этому массиву. О блокировании см. раздел .

Переменная timeout в функции getCustomClient жёстко кодирует период окончания действия этого объекта. Если Вам нужен другой период окончания действия, специфицируйте другое значение для этой переменной. Независимо от используемого периода действия, Вы должны вызывать метод expiration предопределённого объекта client для установки его срока окончания действия в то же значение, какое специфицировано Вами для специального объекта. О работе этого метода см. раздел .

Для удаления всех закончивших работу специальных объектов приложения вызовите следующую функцию:

expireCustomClients()


Это всё, что нужно сделать! Если Вы используете этот код, предопределённые объекты client и project имеют следующие дополнительные свойства, которые Вы не должны изменять:

  • client.customClientID


  • project.customClients
  • project.customClientLock


Вы можете специализировать класс путём изменения его методов onInit и onDestroy. Как показано здесь, эти методы - это просто основа. Вы можете добавить код для изменения действий при создании и уничтожении объекта.



Вот этот код:

// Эта функция создаёт новый специальный объект client или запрашивает существующий.

function getCustomClient()
{
// ==========> Измените жёстко кодированный период ожидания <==========
   // Примечание: Не забудьте установить окончание обслуживания client-статуса
   // в то же самое значение, что и использованное ниже в вызове
   // client.expiration. Это даст возможность индексу отключать все предопределённые
   // объекты client в то же время, которое содержится в объекте project.

   var timeout = 600;

   var customClient = null;
   var deathRow = null;

   var newObjectWasCreated = false;

   var customClientLock = getCustomClientLock();

   customClientLock.lock();
   var customClientID = client.customClientID;

   if ( customClientID == null ) {

      customClient = new CustomClient(timeout);

      newObjectWasCreated = true;
   }

   else {
      var customClients = getCustomClients();
       customClient = customClients[customClientID];
       if ( customClient == null ) {
         customClient = new CustomClient(timeout);
         newObjectWasCreated = true;



      }
      else {

         var now = (new Date()).getTime();

         if ( customClient.expiration <= now ) {

            delete customClients[customClientID];

            deathRow = customClient;

             customClient = new CustomClient(timeout);
             newObjectWasCreated = true;
         }

         else {
             customClient.expiration = (new Date()).getTime() +

               timeout*1000;

         }
      }

   }
   if ( newObjectWasCreated )
       customClient.onInit();
   customClientLock.unlock();

   if ( deathRow != null )
       deathRow.onDestroy();
   return customClient;
}

// Функция для удаления старых специальных объектов client.

function expireCustomClients()

{
   var customClients = getCustomClients();

   var now = (new Date()).getTime();
   for ( var i in customClients ) {

      var clientObj = customClients[i];

      if ( clientObj.expiration <= now ) {

         var customClientLock = getCustomClientLock();

         customClientLock.lock();



         if ( clientObj.expiration <= now ) {

            delete customClients[i];

         }

         else {

            clientObj = null;

         }

         customClientLock.unlock()

         if ( clientObj != null )

            clientObj.onDestroy();

      }   }   }

// Не вызывайте эту функцию явно.
// Она используется методами getCustomClient и expireCustomClients.

function getCustomClientLock()
{
    if ( project.customClientLock == null ) {
      project.lock()

      if ( project.customClientLock == null )

         project.customClientLock = new Lock()

      project.unlock()
   }

   return project.customClientLock
}

// Не вызывайте эту функцию явно.
// Она используется методами getCustomClient и expireCustomClients.

function getCustomClients()
{
    if ( project.customClients == null ) {
      project.lock()

      if ( project.customClients == null )

         project.customClients = new Object()

      project.unlock()
   }

   return project.customClients
}

// Конструктор класса CustomClient. Не вызывайте его явно.
// Используйте вместо него функцию getCustomClient.

function CustomClient(seconds)
{



   var customClients = getCustomClients();

   var customClientID = ssjs_generateClientID();

   this.onInit = CustomClientMethod_onInit;

   this.onDestroy = CustomClientMethod_onDestroy;

   this.expiration = (new Date()).getTime() + seconds*1000;>

   client.customClientID = customClientID;

   customClients[customClientID] = this;
}

// Если нужно специализировать, переопределите следующие две функции.

function CustomClientMethod_onInit()
{
   // ==========> Добавьте код инициализации Вашего объекта <==========

   // Этот метод вызывается при блокировке.
}function CustomClientMethod_onDestroy()
{

   // ==========> Добавьте код очистки Вашего объекта <==========

   // Этот метод не вызывается из блокировки.
}


Содержание раздела