runShellCommand и переменные

Коллеги, добрый день! Объявляю переменные до функции runShellCommand. Внутри этой функции работают нормально. За пределами этой функции значения не видны.
Например:
var a
runShellCommand(url, {
captureOutput: true,
exitCallback: function (exitCode, capturedOutput) {
a=true;
}})
Переменную а в лог выводит undefined. Если внутри функции смотреть значение переменной - все ок.
Как использовать значение переменных из этой функции далее?

Добрый день.
Поскольку в приведенном примере у вас переменная «a» объявлена, но не определена (undefined), а exitCallback функция вызывается по завершению процесса выполнения команды — в лог будет выводиться сначала значение объявленной переменной (undefined), а после этого значение из функции колбэка.
В примере в комментариях пронумерован вывод в лог для понимания:

var a;
runShellCommand("date", {
    captureOutput: true,
    exitCallback: function(exitCode, capturedOutput) {
        if (exitCode === 0) {
            a = true; 
            log(a); // 3. true
            return;
        }
    }
});
log(a); // 1. undefined
a = false; 
log(a); // 2. false

Можно использовать таймеры, но лучше изменить архитектуру кода. Например, использовать функции и вызывать их в exitCallback:

var a;
runShellCommand("date", {
    captureOutput: true,
    exitCallback: function(exitCode, capturedOutput) {
        if (exitCode === 0) {
            a = true; 
            log(a); // 1. true
            b();
            return;
        }
    }
});
function b() {
  log(a); // 2. true
  a = false; 
  log(a); // 3. false
}

1 Like

Спасибо! Работает!
Еще такой вопрос:
Как полю объекта виртуального устройства присвоить readonly
Например:

defineVirtualDevice('office_rule', {
      kor_Light: {
        title: "Свет в коридоре",
	    type: "switch",
	    value: false,
	  
        },
})
If (a==1)
{
dev['office_rule/kor_Light']=readonly;
}

Используйте API, в частности метод setReadonly():

getDevice("office_rule").getControl("kor_Light").setReadonly(true) 
1 Like