Javascript.RU

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

Ajax разсинхронизация.
День добрый. Имею такой код ajax для управления нагрузками на микроконтроллере.

На стороне сервера все просто получили значение выхода записали в порт, затем прочитали из порта отправили в Ajax подтвердили включение.

Засада в том что в браузере происходит следующие, нажали checkbox он становиться checked, туже AJAX меняет его на unchecked потом приходит состояние полученное с микроконтроллера и он опять переходит в checked. Происходит такое мигание перед включением.
Опрос Ajax 1сек.

Как сделать проверку в Ajax, что уже можно менять данные, чтобы это не происходило по воле божией...

Сама статья https://startingelectronics.org/arti...n-LED-control/

код.....
<script>
strLED1 = "";
function GetArduinoIO()
{
nocache = "&nocache=" + Math.random() * 1000000;
var request = new XMLHttpRequest();
request.onreadystatechange = function()
{
if (this.readyState == 4) {
if (this.status == 200) {
if (this.responseXML != null) {

var count;

if (this.responseXML.getElementsByTagName('LED')
[0].childNodes[0].nodeValue === "checked") {
document.LED_form.LED1.checked = true;
}
else {
document.LED_form.LED1.checked = false;
}
}
}
}
}
request.open("GET", "ajax_inputs" + strLED1 + nocache, true);
request.send(null);
setTimeout('GetArduinoIO()', 1000);
strLED1 = "";
}

function GetCheck()
{
if (LED_form.LED1.checked) {
strLED1 = "&LED1=1";
}
else {
strLED1 = "&LED1=0";
}
}

тут checkbox в html
<input type="checkbox" name="LED1" value="0" onclick="GetCheck()" />LED 1 (D6)<br /><br />
Ответить с цитированием
  #2 (permalink)  
Старый 26.02.2018, 11:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,595

Попробуйте так:
strLED1 = "";
function GetArduinoIO()
{
  nocache = "&nocache=" + Math.random() * 1000000;
  var request = new XMLHttpRequest();
  request.onreadystatechange = function()
  {
    if (this.readyState == 4) {
      if (this.status == 200) {
        if (this.responseXML != null) {

          var count;

          if (this.responseXML.getElementsByTagName('LED')
              [0].childNodes[0].nodeValue === "checked") {
            document.LED_form.LED1.checked = true;
          }
          else {
            document.LED_form.LED1.checked = false;
          }
        }
      }
      setTimeout(GetArduinoIO, 1000);
    }
  }
  request.open("GET", "ajax_inputs" + strLED1 + nocache, true);
  request.send(null);
  strLED1 = "";
}

function GetCheck()
{
  if (LED_form.LED1.checked) {
    strLED1 = "&LED1=1";
  }
  else {
    strLED1 = "&LED1=0";
  }
}
Суть в том, что тут запрос будет выполняться не каждую секунду, а через секунду после ответа.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 26.02.2018, 12:37
Новичок на форуме
Отправить личное сообщение для Sochirom Посмотреть профиль Найти все сообщения от Sochirom
 
Регистрация: 21.01.2018
Сообщений: 8

Попробовал, все ровно также... Поставил после выполнения if (this.responseXML != null) {
Ответить с цитированием
  #4 (permalink)  
Старый 26.02.2018, 13:18
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Sochirom,
а опрашивается и управляется всего один порт?
Ответить с цитированием
  #5 (permalink)  
Старый 26.02.2018, 14:54
Новичок на форуме
Отправить личное сообщение для Sochirom Посмотреть профиль Найти все сообщения от Sochirom
 
Регистрация: 21.01.2018
Сообщений: 8

Нет много, но и с одним тот же прикол. Видимо нужно делать проверку по флагу, только вот не знаю с какой стороны подойти к этому, что проверять?
Ответить с цитированием
  #6 (permalink)  
Старый 26.02.2018, 15:32
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Sochirom
Нет много
Ну так зачем тогда такие сложности, не проще ли json формат, в котором ключи, это имена/индексы/и т.п. портов/флажков, а значения, это состояние портов. Останется проверить:

if(!!this.responseXML) {
   //обходим в цикле объект определяя состояние флажков
} //.... чего-то
Ответить с цитированием
  #7 (permalink)  
Старый 26.02.2018, 17:13
Новичок на форуме
Отправить личное сообщение для Sochirom Посмотреть профиль Найти все сообщения от Sochirom
 
Регистрация: 21.01.2018
Сообщений: 8

Так я и так использую XML также имена ключи в принципе тот же JSON, проблема в том что скрипт успевает забрать с web сервера старые данные, а потом приходят актуальные...
Ответить с цитированием
  #8 (permalink)  
Старый 26.02.2018, 17:44
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Sochirom
Так я и так использую XML также имена ключи в принципе тот же JSON
Ну не совсем тот же.

Сообщение от Sochirom
проблема в том что скрипт успевает забрать с web сервера старые данные, а потом приходят актуальные...
Может проблема глубже? Не понятно кто управляет портами контроллера - только клиент или же еще кто-то? Если только клиент зачем постоянные опросы контроллера? Если не только клиент, то у кого тогда приоритет?
Ответить с цитированием
  #9 (permalink)  
Старый 26.02.2018, 19:35
Новичок на форуме
Отправить личное сообщение для Sochirom Посмотреть профиль Найти все сообщения от Sochirom
 
Регистрация: 21.01.2018
Сообщений: 8

Сейчас управляет только клиент, постоянный опрос для аналоговых портов и термо датчиков. Приоритет на стороне Ajax.
Ответить с цитированием
  #10 (permalink)  
Старый 26.02.2018, 19:49
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Ну тогда почему не так сделать:

Имена портов (или номера портов) связаны именами (номерами-индексами) с соответствующими элементами на клиенте, в случае JSON это и проще будет. Если опрашиваются только аналоговые входы, то запросы сервера и его ответ никак не должны влиять на флажки управления других портов.

Изменение состояния какого либо порта, это запрос сервера с передачей состояния флажка +this.checked, который был изменен, а не отправкой состояние всех, которые не изменялись. Ответ сервера в данном случае, это только подтверждение успешности операции, хотя можно вернуть и состояние порта как 0/1 простым текстом, и как числом определить this.checked = +ответ.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отправить из Ajax одну переменную и получить ответ в Ajax виде массива? olegalimov AJAX и COMET 42 14.02.2018 10:35
Отправка формы после ajax проверки ShutTap Общие вопросы Javascript 15 08.04.2016 11:46
Ajax таблица gofkane Работа 1 26.09.2011 18:26
Ajax таблица gofkane Работа 0 25.09.2011 11:53
Ajax разбор метода mycoding jQuery 14 21.05.2010 10:57