powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Вопрос по JS, синхронизация локального массива с серверной информацией
2 сообщений из 2, страница 1 из 1
Вопрос по JS, синхронизация локального массива с серверной информацией
    #38704620
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С JS я знаком постольку-поскольку, просьба поправить меня, если я где-то делаю неправильно.

Есть внутренний сервис мониторинга оборудования (интранет).
Мониторинг отображает состояние различных устройств, размещенных по разным адресам, состояние устройств обновляется раз в минуту (сервер опрашивает устройства раз в минуту). Состав (количество) устройств может меняться. Мониторинг осуществляет тот же сервер, на котором работает сайт, в браузере отображаются результаты опроса устройств.
Теперь я решил прикрутить к мониторингу географическую карту.
Я предполагаю сделать так.

1. На серверной стороне скрипт обрабатывает аргумент mode.
1.1. Если mode не задан, то скрипт возвращает html-код страницы-заглушки (с подключенными стилями, скриптами, но без данных).
1.2. Если mode=json, то скрипт производит опрос устройств, сохраняет данные опроса в массив и возвращает json_encode($data).

2. На клиентской стороне подключаются библиотеки Яндекс.Карт и jQuery. После загрузки страницы и затем каждую минуту запускается js-процедура, которая осуществляет POST-запрос с параметром mode=json, полученные данные присваивает глобальной переменной data и затем обновляет данные на карте. Примерно так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
// page.js
var map;
var data = {};
var geo = {};
...
function page_refresh()
{
  var xmlHttp = null;
  xmlHttp = new XMLHttpRequest();
  xmlHttp.open("POST", url, false);
  xmlHttp.send(params);
  data = JSON.parse(xmlHttp.responseText);
  ymap_refresh();
  setTimeout(page_refresh,60000);
}
function ymap_init()
{
  var base = [11,22];
  map = new ymaps.Map("map_canvas", {center: base, zoom: 16, type: 'yandex#publicMap'});
  ymap_refresh();
}
function ymap_refresh()
{
  ...
}



3. В процедуре ymap_refresh осуществляется отрисовка объектов на карте. Самый простой способ это сделать — удалить все объекты на карте и нарисовать все заново, на основе информации из data. Но мне кажется, что в этом случае в процессе перерисовки объекты будут мерцать.
Поэтому я думаю сделать глобальный объект geo, в котором будут храниться гео-объекты, размещенные на карте (ассоциативный массив с теми же ключами, что и в массиве data). И процедура будет такая:
3.1. Перебираю весь массив geo, его ключи добавляю в массив all.
3.1. Перебираю массив data, нахожу соответствующий ему элемент массива geo.
3.1.1. Если нашел, значит объект уже добавлен на карту, обновляю его параметры. Удаляю из all элемент с ключом объекта.
3.1.2. Если не нашел, значит это новый объект. Добавляю его на карту с нужными параметрами.
3.2. Если в массиве all остались элементы, значит часть объектов была удалена с момента предыдущего запроса. Удаляю с карты все гео-объекты, ключи которых есть в all.

Подскажите, все ли правильно?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Вопрос по JS, синхронизация локального массива с серверной информацией
    #38704803
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла такая идея, чтобы обойтись без лишнего обхода массива (для получения all).
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
var data, geo, cnt;
function refresh()
{
  cnt++;
  for (var id in data)
  {
    var item = data[id];
    if (geo.hasOwnProperty(id))
    {
      //объект уже есть в geo, нужно обновить его параметры
      ...
      geo[id]['cnt'] = cnt;
    }
    else
    {
      //новый объект, нужно добавить на карту
      ...
      geo[id]['cnt'] = cnt;
    }
  }
  for (var id in geo)
  {
    if (geo[id]['cnt'] != cnt)
    {
      //объект нужно удалить
      ...
      delete geo[id];
    }
  }
}
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Вопрос по JS, синхронизация локального массива с серверной информацией
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]