Значение переменной для асинхронного чтения - PullRequest
1 голос
/ 21 июня 2019

Я читаю значение из реестра и устанавливаю значение из реестра в переменную в моем коде. Я вижу, что получение значения из реестра происходит асинхронно.

Я пакет regedit с узла. Я пробовал setTimeout для constructENVTable, но это не сработало. Обратите внимание: mainfunc () запускается при загрузке тела HTML-страницы

//declared globally
var regValue = "";

function mainfunc() {
  setRegistryValueForFirstTime();
  constructENVTable();
}

function setRegistryValueForFirstTime() {
  let path = "HKLM\\....\\Environment";
  regedit.list('HKLM\\...\\Environment', function(err, result) {
    try {
      regValue = result[path].values.XYZ.value;
      alert(regValue); //prints value correctly
      app.console.log("Registry value for ANSYS_LI is  already set");
    } catch (err) {
      app.console.log(err);
      app.console.log("setting up registry value");
      setRegistryValue();
    }
    alert(regValue); //doesn't print value
  });
}

  function constructENVTable() {
    alert(regValue); //doesn't print value
  }

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

мм вы можете попробовать обернуть regValue с обещанием, как это:

var regValue;

function mainfunc() {
    setRegistryValueForFirstTime();
    constructENVTable();
}

function setRegistryValueForFirstTime() {
    let path = "HKLM\\....\\Environment";
    regedit.list('HKLM\\...\\Environment', function (err, result) {
        try {
            regValue = new Promise(
                (resolve, reject) => resolve(result[path].values.XYZ.value)
            )

            app.console.log("Registry value for ANSYS_LI is  already set");
        } catch (err) {
            app.console.log(err);
            app.console.log("setting up registry value");
            setRegistryValue();
        }
        alert(regValue); //doesn't print value
    });
}

function constructENVTable() {
    // alert(regValue); //doesn't print value
    regValue.then(
        value => alert(value)
    )
}
1 голос
/ 21 июня 2019

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

var regValue = "";

function mainfunc() {
  setRegistryValueForFirstTime();
}

function setRegistryValueForFirstTime() {
  let path = "HKLM\\....\\Environment";
  regedit.list('HKLM\\...\\Environment', function(err, result) {
    try {
      regValue = result[path].values.XYZ.value;
      app.console.log("Registry value for ANSYS_LI is  already set");
      constructENVTable(regValue); //prints value correctly
    } catch (err) {
      app.console.log(err);
      app.console.log("setting up registry value");
      setRegistryValue();
    }
  });
}

function constructENVTable(regValue) {
  alert(regValue); // get value here and alert it
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...