Баг с переменными в модулях node.js
-
Доброго времени суток. Из модулей не читаются переменные BAS.
Создаём новый кирпич node.js и пишем:await require("../InternalFunctions")();
Добавляем файл InternalFunctions со следующим содержимым:
module.exports = async function(){ await BAS_API('VAR_TEST1 = "test";'); console.log([[TEST1]]); };
В выводе консоли ловим "undefined" вместо "test". В основном модуле тот же код работает как надо.
-
@Elemental said in Баг с переменными в модулях node.js:
Доброго времени суток. Из модулей не читаются переменные BAS.
Создаём новый кирпич node.js и пишем:await require("../InternalFunctions")();
Добавляем файл InternalFunctions со следующим содержимым:
module.exports = async function(){ await BAS_API('VAR_TEST1 = "test";'); console.log([[TEST1]]); };
В выводе консоли ловим "undefined" вместо "test". В основном модуле тот же код работает как надо.
await require("../InternalFunctions")(); [[TEST1]]
скрипт: 101.xml
-
Спасибо, так работает. Костыль конечно, но лучше, чем ничего.
-
@Elemental Это не костыль, это особенность работы внутренних языков. При вызове BAS_API процесс ноды уже должен иметь список переменных, которые он будет использовать, он не может их взять с потолка, иначе получилась бы каша. Так что нужно либо в самом экшене Node.js сделать так, как показал @Fox (можно до импорта функции, можно после) либо проинициализировать переменную до кубика ноды, это неважно. Главное дать понять системе, что эту переменную в принципе нужно создать.
-
@Oyasumi-Punpun Я в своей жизни сталкивался с бейсиком, паскалем, делфи, C, C++, PHP, JavaScript, Java и др. и ни в одном языке программирования рабочие переменные функции не нужно было инициализировать за их пределом и тем более, в основном блоке кода, в другом файле, не относящемся ни коим образом к этому модулю. Так что да, это костыль.
-
Тоже столкнулся с этим. И тупо инициализирую их перед инициализацией модуля.
[[SCR_WIDTH]]=0;
[[WND_HEIGHT]]=0;
[[CURRENT_URL]]="";
Если эти переменные уже инициализированы выше, можно вместо инициализации их в массив загнать. Это тоже работает как вариант костыля, переменные начинают быть видны в модуле.
let tmp=[ [[SCR_WIDTH]], [[WND_HEIGHT]], [[CURRENT_URL]] ];
Может это уже где-то писали.
-
Эхх, если бы супер-программисты вроде @Elemental которые видели 100500 языков заглядывали в реализацию (или хотя бы интересовались), могли бы увидеть, что переменные баса во первых != переменным js, а во вторых передаются массивом в качестве параметра ПРИ ВЫЗОВЕ модуля, и, конечно, не будут видны при использовании BAS_API в таком случае. Но как сказал уважаемый ТС, это костыль (хотя это не так), но ему лучше знать.
-
@Dmitry33 по делу - можно устанавливать значения перед require(...) прямо в коде, можно как у вас в примере, с помощью массива. На самом деле главная цель - хоть как-то задать эти переменные, можно даже так, если вам начальное значение не нужно:
[[TEST1]]; [[TEST2]]; ... [[TESTN]];
-
@Oyasumi-Punpun А чо теперь так можно? +1 Надоело задавать [[]] = ничего=)