...

Работа с настройками модуля

Тема в разделе "Примеры сценариев", создана пользователем ava_var, 1 апр 2023.

  1. ava_var

    ava_var Активный участник

    Для получения настроек модуля на клиенте нам приходится вызывать серверный скрипт.
    Это операция долгая, так как серверные скрипты выполняются через очередь и в итоге наш виджет может ожидать довольно долгое время, прежде чем пользователь увидит результат.

    Стандартный подход для получения настроек

    Спойлер: Клиентский скрипт
    Код:
    
    /* Client scripts module */
    async function Init(): Promise<void> {
        
    await Server.rpc.LoadSettings();
    }

    async function canRender(): Promise<boolean> {
        return 
    Context.data.debug_key === 'enabled';
    }

    Спойлер: Серверный скрипт
    Код:
    
    /* Server scripts module */
    async function LoadSettings(): Promise<void> {
        
    Context.data.debug_key = Namespace.params.data.debug_key;
    }

    Оптимизация
    Я предлагаю ускорить обращение за счет использования кэша модуля.
    Подход такой - обращаемся сначала в кэш, если в кэше нет нашего ключа - обращаемся к серверному сценарию.
    Код:
    
     /* Client scripts module */
    async function Init(): Promise<void> {
        
    let debug_keystring|undefined;
        
    // Получаем значение из кэша модуля
        
    let cacheItem await Namespace.cache.getItem('debug_key');
        
    // Если в кэше что-то было
        
    if (cacheItem) {
            
    // Извлекаем значение настроек
            
    debug_key = <string>JSON.parse(cacheItem);
            
    // Сохраняем в контекстную переменную
           
    Context.data.debug_key debug_key;
        }
        
    // Если из кэша не получилось ничего достать
        
    if (typeof debug_key === 'undefined') {
            
    // Выполняем серверный сценарий
            
    await Server.rpc.LoadSettings();
            
    // Получаем результат через контекстную переменную
            
    debug_key Context.data.debug_key;
            
    // Сохраняем значение в кэш модуля на 1 час
            
    Namespace.cache.setItem('debug_key'JSON.stringify(debug_key), 60 60 1000);
        }
    }
    Серверный скрипт оставляем без изменений.

    Что получаем
    В итоге получаем схему, что большинство запросов от пользователей будут выполнять быстро.
    Периодически, (в данном случае 1 раз в час), будет отправляться запрос на сервер.
    При работе с кэшем помните - значение в кэше может исчезнуть в любой момент. 1 час, который мы выставили - это максимальное время жизни кэша.
    При большой нагрузке на сервер значение в кэше может обнулиться и раньше.

    Дополнение
    При таком подходе, мы можем пропустить обновление настроек модуля.
    Если настройки модуля изменяются часто, то я предлагаю следующий подход
    1. Создаем кастомную форму для настроек модуля
    [​IMG]
    2. Добавляем стандартную форму элемента и кнопку
    [​IMG]
    3. По клике на кнопку будем скидывать кэш.
    Код:
    
     async function cacheReset(): Promise<void> {
        
    await Namespace.cache.setItem('debug_key'JSON.stringify(undefined));
    }
    4. Получим вот такую форму настроек модуля.
    [​IMG]
    Последнее редактирование: 4 апр 2023
  2. kurbatov-la

    kurbatov-la Активный участник

    Не грузятся картинки 1, 2 и 4
  3. fedorova

    fedorova Участник

    Почему в кэше, а не в сторадже?
  4. ava_var

    ava_var Активный участник

    1.Мне казалось, что это дешевле и быстрее для системы.
    2.Кэш сбрасывается сам периодически, это небольшая помощь для тех случаев,когда забудут сбросить кэш настроек