Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.05.2021, 09:10
Новичок на форуме
Отправить личное сообщение для DmitryR Посмотреть профиль Найти все сообщения от DmitryR
 
Регистрация: 18.05.2021
Сообщений: 8

Отправка GET запроса по таймеру
HTTP сервер предоставляет данные по запросу от клиента, предоставляется массив чисел. Запрос генерируется по таймеру каждую секунду. Как можно сделать так, чтобы при большой загруженности сервера время данного запроса увеличивалось, а при меньшей загруженности - уменьшалось?
function Timer2(){
      xhr.open("GET", "content.bin?r=" + Math.random(), true);
      xhr.responseType = "arraybuffer";
      xhr.onload = function (oEvent) {
          var uint16Array = new Uint16Array(this.response);

          myChart.data.datasets[0].data = data16Array;

          myChart.update();             
      }
      xhr.send(null);
      idTimer2 = setTimeout(Timer2, 1000);
    }

Вот у таймера время 1000. Я так понимаю надо завести туда переменную и условие if, которое сможет управлять данной переменной, вопрос в том, что это за условие и как его прописать?
По аналогии с этим
if (ошибка запроса из-за перегрузки сервера) {
    // увеличить интервал для следующего запроса
    delay *= + 500;
  }
Ответить с цитированием
  #2 (permalink)  
Старый 18.05.2021, 10:38
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от DmitryR
Как можно сделать так, чтобы при большой загруженности сервера время данного запроса увеличивалось, а при меньшей загруженности - уменьшалось?
Информацию о "загруженности" может прислать только сам сервер...
Получив ее в ответе на запрос чисел, на клиенте можно скорректировать размер времени ожидания.

Можно так же составить свое "представление" о загруженности сервера...
Засечь время от начала запроса до получения ответа. И на основании этого делать какой-то расчет времени ожидания...
Ответить с цитированием
  #3 (permalink)  
Старый 18.05.2021, 10:48
Новичок на форуме
Отправить личное сообщение для DmitryR Посмотреть профиль Найти все сообщения от DmitryR
 
Регистрация: 18.05.2021
Сообщений: 8

Сообщение от ksa Посмотреть сообщение
Информацию о "загруженности" может прислать только сам сервер...
Я думал может алгоритм типа:
-Сервер работает, делает свою задачу
-Отправляем ему GET запрос
-Обрабатывает, присылает ответ
-Потом, например, у сервера появляются более приоритетные задачи
-Клиен посылает GET запрос, сервер его не обрабатывает
-А тем временем клиент уже посылает новый GET запрос, понимает, что запросы не обрабатываются вовремя, умеличивает время

Какой-то такой предохранитель на случай занятости сервера, чтобы клиент не заакидывал его кучей запросов, на которые не приходит ответ. У сервера там идет параллельная работа, возможно он может вообще не отвечать на запросы клиента какое-то время, поэтому сообщить о своей занятости тоже не сможет
Ответить с цитированием
  #4 (permalink)  
Старый 18.05.2021, 11:22
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от DmitryR
А тем временем клиент уже посылает новый GET запрос
Можно новый запрос посылать лишь получив ответ на предыдущий запрос...
Так не будет "кучи" запросов без ответов.
Ответить с цитированием
  #5 (permalink)  
Старый 18.05.2021, 11:46
Новичок на форуме
Отправить личное сообщение для DmitryR Посмотреть профиль Найти все сообщения от DmitryR
 
Регистрация: 18.05.2021
Сообщений: 8

Сообщение от ksa Посмотреть сообщение
Можно новый запрос посылать лишь получив ответ на предыдущий запрос...
Так не будет "кучи" запросов без ответов.
Не подскажите как это сделать в коде? JS не знаю практически. И ще такой момент, надо чтобы не просто сервер был готов отправить новый массив на запрос клиента, но и чтобы это еще успевало прорисовываться на графике (использую Chart js). А то получиться так, что сервер посылать будет часто, а браузер отрисовывать не будет успевать.
Может еще сможете подсказать по такой проблеме:
Не перестраивается график ни в какую
function Timer2(){
      xhr.open("GET", "content.bin?r=" + Math.random(), true);
      xhr.responseType = "arraybuffer";
      xhr.onload = function (oEvent) {
        var uint16Array = new Uint16Array(this.response);
        for(var i = 0; i < 256; i++)
        {
          data16Array1[i] = uint16Array[i];
          data16Array2[i] = uint16Array[i+256];
        }
        ChartUpdate(myChart, data16Array1, data16Array2);            
      }
      xhr.send(null);
      idTimer2 = setTimeout(Timer2, 1000);
    }
    function ChartUpdate(chart, data1, data2){
      chart.data.datasets[0].forEach((dataset) => {
        dataset.data.push(data1);
      });
      chart.data.datasets[1].forEach((dataset) => {
        dataset.data.push(data2);
      });
      chart.update();
    }

До этого пробовал так
function Timer2(){
      xhr.open("GET", "content.bin?r=" + Math.random(), true);
      xhr.responseType = "arraybuffer";
      xhr.onload = function (oEvent) {
          var uint16Array = new Uint16Array(this.response);
          for(var i = 0; i < 256; i++)
          {
            data16Array1[i] = uint16Array[i];
            data16Array2[i] = uint16Array[i+256];
          }
          myChart.data.datasets[0].data = data16Array1;
          myChart.data.datasets[1].data = data16Array2;
 
          myChart.update();            
      }
      xhr.send(null);
      idTimer2 = setTimeout(Timer2, 1000);
    }

Вообще никак, хотя вроде все логично по коду
Ответить с цитированием
  #6 (permalink)  
Старый 18.05.2021, 11:48
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Используя web socket сервер может сам инициировать передачу новых данных клиенту
Ответить с цитированием
  #7 (permalink)  
Старый 18.05.2021, 12:13
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Сообщение от DmitryR
Не перестраивается график ни в какую
Про это надо смотреть нет ли каких других ошибок.
Если вы хотите посылать запросы на сервер не чаще 1 сек, но после отрисовки, то можно сделать примерно так

function Timer2(){
     let t0;   
      xhr.open("GET", "content.bin?r=" + Math.random(), true);
      xhr.responseType = "arraybuffer";
      xhr.onload = function (oEvent) {
          var uint16Array = new Uint16Array(this.response);
          for(var i = 0; i < 256; i++)
          {
            data16Array1[i] = uint16Array[i];
            data16Array2[i] = uint16Array[i+256];
          }
          myChart.data.datasets[0].data = data16Array1;
          myChart.data.datasets[1].data = data16Array2;
  
          myChart.update();  
          let dt = 1000 - (performance.now() - t0)  
          setTimeout(Timer2, dt>0? dt : 0);       
      }
      t0 = performance.now(); // время посылки запроса
      xhr.send(null);
    }
Ответить с цитированием
  #8 (permalink)  
Старый 18.05.2021, 12:15
Новичок на форуме
Отправить личное сообщение для DmitryR Посмотреть профиль Найти все сообщения от DmitryR
 
Регистрация: 18.05.2021
Сообщений: 8

Сообщение от Vlasenko Fedor Посмотреть сообщение
Используя web socket сервер может сам инициировать передачу новых данных клиенту
Пока хотелось бы все это провернуть на Netconn
Ответить с цитированием
  #9 (permalink)  
Старый 18.05.2021, 16:33
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от DmitryR
надо чтобы не просто сервер был готов отправить новый массив на запрос клиента, но и чтобы это еще успевало прорисовываться на графике
Тогда нужно отлавливать окончание отрисовки и только тогда слать запрос...

Сообщение от DmitryR
JS не знаю практически
Тогда дело плохо.
Имеет смысл найти того кто знает и оплатить его работу...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка GET запроса Alexey1769 AJAX и COMET 0 14.07.2017 14:12
JSONP - отправка запроса на удаленный сервер winne3r AJAX и COMET 1 06.09.2015 16:43
Отправка запроса серверу - ReferenceError zalza AJAX и COMET 0 28.11.2012 15:01
Фоновая отправка запроса bugiman AJAX и COMET 1 07.11.2012 17:04
отправка запроса KANekT AJAX и COMET 0 15.04.2011 08:34