Странное поведение цикла for

День добрый!

Для вот такого кода

defineVirtualDevice('testForLoop', {
  title: { en: 'Test values', ru: 'Тестовые значения' },
  cells: {
    value01: {
      title: { en: 'Value - 01', ru: 'Значение - 01' },
      type: 'value',
      readonly: true,
      value: 10
    },
    value02: {
      title: { en: 'Value - 02', ru: 'Значение - 03' },
      type: 'value',
      readonly: true,
      value: 20
    },
    value03: {
      title: { en: 'Value - 03', ru: 'Значение - 03' },
      type: 'value',
      readonly: true,
      value: 30
    },
    value04: {
      title: { en: 'Value - 04', ru: 'Значение - 04' },
      type: 'value',
      readonly: true,
      value: 40
    }
  }
});

var controls = [
  'testForLoop/value01',
  'testForLoop/value02',
  'testForLoop/value03',
  'testForLoop/value04'
];

for (var i = 0; i < controls.length; i++) { 
  log('index - {}', i);
  log('control - {}', controls[i]); 
  log('value - {}', dev[controls[i]]);
};

Имеем вот такой вывод. Странность (двойное исполнение последнего оператора цикла на первой итерации, а может, повторение последнего оператора предыдущей итерации на второй) выделена:

Что интересно:

  • если контролов будет 3 (соответственно, значений в массиве имен контролов), то этого явления не наблюдается.
  • если контролов будет 10 - это наблюдается для 1, 4, 7 итераций.
  • если увеличить еще - такое задвоение наблюдается уже в других местах.
    Закономерности не выявил.

Добрый день!

Мне кажется дело в том, что этот цикл вне кода правил выполняется. Уточню ещё у коллег, как это должно работать. Ответим завтра или после праздников.

Добрый день!
В вашем коде есть небольшая опечатка она скорее всего не влияет на вашу проблему, но может вводит в заблуждении при интерпретации вывода:

value02: {
  title: { en: 'Value - 02', ru: 'Значение - 03' }, // Здесь "Значение - 03" ошибочно
  type: 'value',
  readonly: true,
  value: 20
},
value03: {
  title: { en: 'Value - 03', ru: 'Значение - 03' },
  type: 'value',
  readonly: true,
  value: 30
}

Есть задвоение значения 03

Я провел дополнительные изыскания.

Есть основания полагать, что это не код исполняется дважды, а дублируются записи в журнале. Пока по неведомым закономерностям.

Что тоже не добавляет ясности при анализе поведения.

Коллеги подтверждают, что использования dev вне кода правил не предусмотрено и приводит к непредсказуемым результатам. (документация)

Не имеет значения.

Не туда смотрите.

defineVirtualDevice('testForLoop', {
  title: { en: 'Test values', ru: 'Тестовые значения' },
  cells: {
    value01: {
      title: { en: 'Value - 01', ru: 'Значение - 01' },
      type: 'value',
      readonly: true,
      forceDefault: true,
      value: 10
    },
    value02: {
      title: { en: 'Value - 02', ru: 'Значение - 02' },
      type: 'value',
      readonly: true,
      value: 20
    },
    value03: {
      title: { en: 'Value - 03', ru: 'Значение - 03' },
      type: 'value',
      readonly: true,
      value: 30
    },
    value04: {
      title: { en: 'Value - 04', ru: 'Значение - 04' },
      type: 'value',
      readonly: true,
      value: 40
    },
    start: {
      title: { en: 'Start', ru: 'Старт' },
      type: 'switch',
      readOnly: false,
      forceDefault: true,
      value: false
    }
  }
});

var controls = [
  'testForLoop/value01',
  'testForLoop/value02',
  'testForLoop/value03',
  'testForLoop/value04'
];

defineRule({
  whenChanged: 'testForLoop/start',
  then: function(newValue) {
    if (newValue) {
      for (var i = 0; i < controls.length; i++) { 
        log('index - {}', i);
        log('control - {}', controls[i]); 
        dev[controls[i]]++;
        log('value - {}', dev[controls[i]]);
      };
      dev['testForLoop/start'] = false;
    };
  }
});

Поведение ровно такое же.

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

Работаю вместо вашего тестирования…

ошибка где-то в выводе журнала на интерфейс.
в консоли такого не увидеть.

и оно же по команде journalctl -n 1000 --no-pager

Прошу прощения за долгий ответ.

Вы правы - проблема воспроизводится и передана разработчикам.