12 063
правки
(Подготовка страницы к переводу) |
(Отметить эту версию для перевода) |
||
Строка 1: | Строка 1: | ||
<languages/> | <languages/> | ||
<translate> | <translate> | ||
<!--T:1--> | |||
В обновлённом движке правил wb-rules присутствует ряд важных нововведений, касающихся логики написания сценариев. | В обновлённом движке правил wb-rules присутствует ряд важных нововведений, касающихся логики написания сценариев. | ||
= Сценарии = | = Сценарии = <!--T:2--> | ||
== Изоляция сценариев == | == Изоляция сценариев == <!--T:3--> | ||
<!--T:4--> | |||
Начиная с версии wb-rules 2.0, каждый файл сценария запускается в своём отдельном пространстве имён - '''контексте'''. Таким образом, каждый сценарий может определять | Начиная с версии wb-rules 2.0, каждый файл сценария запускается в своём отдельном пространстве имён - '''контексте'''. Таким образом, каждый сценарий может определять | ||
свои функции и глобальные переменные без риска изменить поведение других сценариев. | свои функции и глобальные переменные без риска изменить поведение других сценариев. | ||
=== Пример === | === Пример === <!--T:5--> | ||
<!--T:6--> | |||
В качестве примера приведём два сценария, одновременно запускаемых в движке правил. | В качестве примера приведём два сценария, одновременно запускаемых в движке правил. | ||
Каждый сценарий определяет глобальные переменные и функции. | Каждый сценарий определяет глобальные переменные и функции. | ||
<!--T:7--> | |||
В предыдущих версиях wb-rules обращение к глобальной переменной, изменяемой в нескольких | В предыдущих версиях wb-rules обращение к глобальной переменной, изменяемой в нескольких | ||
файлах сценариев, может привести к неопределённому поведению. В версиях, начиная с 2.0, | файлах сценариев, может привести к неопределённому поведению. В версиях, начиная с 2.0, | ||
поведение строго определено и такое же, как будто сценарий единственный в системе. | поведение строго определено и такое же, как будто сценарий единственный в системе. | ||
<!--T:8--> | |||
В комментариях указан вывод команд log для ранних версий и для актуальной версии. | В комментариях указан вывод команд log для ранних версий и для актуальной версии. | ||
<!--T:9--> | |||
'''Сценарий 1 (rules1.js)''' | '''Сценарий 1 (rules1.js)''' | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
test1 = 42; | test1 = 42; | ||
<!--T:10--> | |||
setTimeout(function myFuncOne() { | setTimeout(function myFuncOne() { | ||
log("myFuncOne called"); | log("myFuncOne called"); | ||
Строка 36: | Строка 43: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:11--> | |||
'''Сценарий 2 (rules2.js)''' | '''Сценарий 2 (rules2.js)''' | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
Строка 41: | Строка 49: | ||
test2 = "Hello"; | test2 = "Hello"; | ||
<!--T:12--> | |||
setTimeout(function myFuncTwo() { | setTimeout(function myFuncTwo() { | ||
log("myFuncTwo called"); | log("myFuncTwo called"); | ||
Строка 50: | Строка 59: | ||
=== Примечание === | === Примечание === <!--T:13--> | ||
<!--T:14--> | |||
В предыдущих версиях wb-rules для изоляции правил рекомендовалось использовать замыкание, т.е. | В предыдущих версиях wb-rules для изоляции правил рекомендовалось использовать замыкание, т.е. | ||
оборачивание кода сценария в конструкцию: | оборачивание кода сценария в конструкцию: | ||
Строка 60: | Строка 70: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:15--> | |||
Начиная с версии 2.0, в подобной конструкции нет необходимости. Тем не менее, старые сценарии, | Начиная с версии 2.0, в подобной конструкции нет необходимости. Тем не менее, старые сценарии, | ||
использующие эту конструкцию, продолжат работу без изменений в поведении. | использующие эту конструкцию, продолжат работу без изменений в поведении. | ||
=== Обходные пути === | === Обходные пути === <!--T:16--> | ||
<!--T:17--> | |||
Если в вашей системе использовалось общее глобальное пространство для хранения общих данных и функций, | Если в вашей системе использовалось общее глобальное пространство для хранения общих данных и функций, | ||
есть несколько способов реализации такого поведения: | есть несколько способов реализации такого поведения: | ||
==== Использование модулей ==== | ==== Использование модулей ==== <!--T:18--> | ||
<!--T:19--> | |||
Можно написать модуль для организации взаимодействия. У модулей есть статическое хранилище, | Можно написать модуль для организации взаимодействия. У модулей есть статическое хранилище, | ||
общее для всех файлов, импортировавших модуль. (см. [[Special:MyLanguage/#модули|Модули]]) | общее для всех файлов, импортировавших модуль. (см. [[Special:MyLanguage/#модули|Модули]]) | ||
==== Постоянное хранилище ==== | ==== Постоянное хранилище ==== <!--T:20--> | ||
<!--T:21--> | |||
Для обмена данными также можно использовать глобальные постоянные хранилища (PersistentStorage). | Для обмена данными также можно использовать глобальные постоянные хранилища (PersistentStorage). | ||
<!--T:22--> | |||
'''Внимание:''' при использовании глобальных постоянных хранилищ может произойти совпадение имён, в | '''Внимание:''' при использовании глобальных постоянных хранилищ может произойти совпадение имён, в | ||
этом случае возможно труднообнаруживаемое нарушение поведения. | этом случае возможно труднообнаруживаемое нарушение поведения. | ||
<!--T:23--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
var ps = new PersistentStorage("my-global-storage", {global: true}); | var ps = new PersistentStorage("my-global-storage", {global: true}); | ||
<!--T:24--> | |||
/// ... | /// ... | ||
<!--T:25--> | |||
ps.myvar = "value"; // это значение доступно для всех пользователей хранилища с именем "my-global-storage" | ps.myvar = "value"; // это значение доступно для всех пользователей хранилища с именем "my-global-storage" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Прототип глобального объекта ==== | ==== Прототип глобального объекта ==== <!--T:26--> | ||
<!--T:27--> | |||
'''ВНИМАНИЕ:''' метод считается "грязным", т.к. все переменные и функции, опубликованные таким образом, | '''ВНИМАНИЕ:''' метод считается "грязным", т.к. все переменные и функции, опубликованные таким образом, | ||
становятся доступными всем сценариям в системе. Старайтесь избегать этого способа. За неопределённое | становятся доступными всем сценариям в системе. Старайтесь избегать этого способа. За неопределённое | ||
поведение при использовании этого метода несёт ответственность сам программист. | поведение при использовании этого метода несёт ответственность сам программист. | ||
<!--T:28--> | |||
Глобальные объекты всех сценариев имеют общий объект-''прототип'', в котором определены стандартные функции | Глобальные объекты всех сценариев имеют общий объект-''прототип'', в котором определены стандартные функции | ||
wb-rules (такие, как defineRule, setTimeout и т.д.). Через него можно передавать переменные или функции | wb-rules (такие, как defineRule, setTimeout и т.д.). Через него можно передавать переменные или функции | ||
в общую область видимости. | в общую область видимости. | ||
<!--T:29--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
global.__proto__.myVar = 42; // теперь myVar - общая переменная для всех сценариев | global.__proto__.myVar = 42; // теперь myVar - общая переменная для всех сценариев | ||
<!--T:30--> | |||
// из других сценариев к переменной можно обращаться так | // из других сценариев к переменной можно обращаться так | ||
log("shared myVar: {}", myVar); | log("shared myVar: {}", myVar); | ||
<!--T:31--> | |||
// или вот так, что чуть более аккуратно, т.к. однозначно показывает, где определена переменная | // или вот так, что чуть более аккуратно, т.к. однозначно показывает, где определена переменная | ||
log("shared myVar: {}", global.__proto__.myVar); | log("shared myVar: {}", global.__proto__.myVar); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:32--> | |||
Правило поиска переменной в первом случае будет выглядеть так: | Правило поиска переменной в первом случае будет выглядеть так: | ||
<!--T:33--> | |||
# Проверяем, есть ли myVar среди локальных переменных (определённой как var myVar = ...). | # Проверяем, есть ли myVar среди локальных переменных (определённой как var myVar = ...). | ||
# Если нет, проверяем, есть ли myVar в глобальном объекте (определённой как myVar = ...). | # Если нет, проверяем, есть ли myVar в глобальном объекте (определённой как myVar = ...). | ||
# Если нет, проверяем, есть ли myVar в ''прототипе'' глобального объекта (определённой как global.__proto__.myVar). | # Если нет, проверяем, есть ли myVar в ''прототипе'' глобального объекта (определённой как global.__proto__.myVar). | ||
<!--T:34--> | |||
Поиск останавливается, как только переменная найдена. | Поиск останавливается, как только переменная найдена. | ||
<!--T:35--> | |||
Таким образом, первый способ обращения будет работать только в том случае, если myVar не определена в верхних областях видимости. | Таким образом, первый способ обращения будет работать только в том случае, если myVar не определена в верхних областях видимости. | ||
== Анонимные правила == | == Анонимные правила == <!--T:36--> | ||
<!--T:37--> | |||
Теперь правила можно объявлять анонимно (без задания специального имени). Это позволит уменьшить путаницу и неочевидное | Теперь правила можно объявлять анонимно (без задания специального имени). Это позволит уменьшить путаницу и неочевидное | ||
поведение системы при дублировании имён правил в одном скрипте. | поведение системы при дублировании имён правил в одном скрипте. | ||
<!--T:38--> | |||
Уникальные имена для анонимных правил генерируются автоматически. | Уникальные имена для анонимных правил генерируются автоматически. | ||
<!--T:39--> | |||
Старый синтаксис (с явным заданием имени правила) продолжит работу без изменений. | Старый синтаксис (с явным заданием имени правила) продолжит работу без изменений. | ||
<!--T:40--> | |||
'''ВНИМАНИЕ:''' начиная с версии 2.0, при объявлении правил с одинаковыми | '''ВНИМАНИЕ:''' начиная с версии 2.0, при объявлении правил с одинаковыми | ||
именами в одном файле теперь будет возвращаться ошибка. | именами в одном файле теперь будет возвращаться ошибка. | ||
=== Пример === | === Пример === <!--T:41--> | ||
<!--T:42--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
defineRule({ | defineRule({ | ||
Строка 148: | Строка 180: | ||
== Управление правилами == | == Управление правилами == <!--T:43--> | ||
<!--T:44--> | |||
В wb-rules 2.0 также появляется возможность управлять выполнением правил. Теперь функция defineRule() возвращает идентификатор | В wb-rules 2.0 также появляется возможность управлять выполнением правил. Теперь функция defineRule() возвращает идентификатор | ||
созданного правила (аналогично setTimeout()/setInterval() ), который можно использовать позже для: | созданного правила (аналогично setTimeout()/setInterval() ), который можно использовать позже для: | ||
<!--T:45--> | |||
* выключения/включения отработки правила; | * выключения/включения отработки правила; | ||
* принудительного запуска тела правила. | * принудительного запуска тела правила. | ||
<!--T:46--> | |||
По умолчанию, все правила включены. | По умолчанию, все правила включены. | ||
=== Пример === | === Пример === <!--T:47--> | ||
<!--T:48--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
var myRule = defineRule({ | var myRule = defineRule({ | ||
Строка 169: | Строка 205: | ||
}); | }); | ||
<!--T:49--> | |||
// ... | // ... | ||
<!--T:50--> | |||
disableRule(myRule); // отключить проверку и выполнение правила | disableRule(myRule); // отключить проверку и выполнение правила | ||
enableRule(myRule); // разрешить выполнение правила | enableRule(myRule); // разрешить выполнение правила | ||
<!--T:51--> | |||
runRule(myRule); // принудительно запустить тело правила (функцию then) | runRule(myRule); // принудительно запустить тело правила (функцию then) | ||
// на текущий момент не поддерживается передача аргументов в then | // на текущий момент не поддерживается передача аргументов в then | ||
Строка 179: | Строка 218: | ||
== Постоянное хранилище данных == | == Постоянное хранилище данных == <!--T:52--> | ||
<!--T:53--> | |||
В wb-rules 2.0 добавлена поддержка постоянных хранилищ. По сути, это объекты, значения в которых будут сохраняться | В wb-rules 2.0 добавлена поддержка постоянных хранилищ. По сути, это объекты, значения в которых будут сохраняться | ||
даже при потере питания контроллера. Такие хранилища удобно использовать для хранения состояний или конфигурации. | даже при потере питания контроллера. Такие хранилища удобно использовать для хранения состояний или конфигурации. | ||
<!--T:54--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
var ps = new PersistentStorage("my-storage"); | var ps = new PersistentStorage("my-storage"); | ||
<!--T:55--> | |||
ps.key = "Hello World"; | ps.key = "Hello World"; | ||
log(ps.key); | log(ps.key); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:56--> | |||
По умолчанию, хранилища создаются локальными для данного файла сценария, с привязкой к имени файла. Таким образом, при создании хранилищ с | По умолчанию, хранилища создаются локальными для данного файла сценария, с привязкой к имени файла. Таким образом, при создании хранилищ с | ||
одинаковыми именами в разных файлах сценариев, создастся два разных хранилища (и сценарий не получит | одинаковыми именами в разных файлах сценариев, создастся два разных хранилища (и сценарий не получит | ||
доступа к "чужим" данным). | доступа к "чужим" данным). | ||
<!--T:57--> | |||
Однако, есть возможность создавать глобальные хранилища. Для этого нужно добавить аргумент { global: true } в | Однако, есть возможность создавать глобальные хранилища. Для этого нужно добавить аргумент { global: true } в | ||
вызов конструктора: | вызов конструктора: | ||
<!--T:58--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
var ps = new PersistentStorage("my-storage", { global: true }); | var ps = new PersistentStorage("my-storage", { global: true }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:59--> | |||
Если такое хранилище уже было создано когда-либо ранее, сценарий получит к нему доступ. | Если такое хранилище уже было создано когда-либо ранее, сценарий получит к нему доступ. | ||
== Виртуальные устройства == | == Виртуальные устройства == <!--T:60--> | ||
<!--T:61--> | |||
В предыдущих версиях wb-rules значения контролов виртуальных устройств хранились только в MQTT retained, что не очень надёжно (в случае | В предыдущих версиях wb-rules значения контролов виртуальных устройств хранились только в MQTT retained, что не очень надёжно (в случае | ||
потери питания данные могли быть легко утеряны). Начиная с версии 2.0, эти значения сохраняются также в специальное хранилище в постоянной | потери питания данные могли быть легко утеряны). Начиная с версии 2.0, эти значения сохраняются также в специальное хранилище в постоянной | ||
памяти и восстанавливаются при загрузке сценария. | памяти и восстанавливаются при загрузке сценария. | ||
<!--T:62--> | |||
Если необходимо каждый раз при перезагрузке скрипта восстанавливать строго определённое значение (т.е. не восстанавливать предыдущее сохранённое), | Если необходимо каждый раз при перезагрузке скрипта восстанавливать строго определённое значение (т.е. не восстанавливать предыдущее сохранённое), | ||
можно добавить в описание контрола поле forceDefault: | можно добавить в описание контрола поле forceDefault: | ||
<!--T:63--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
defineVirtualDevice("vdev", { | defineVirtualDevice("vdev", { | ||
Строка 228: | Строка 277: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:64--> | |||
По умолчанию поле принимает значение false. | По умолчанию поле принимает значение false. | ||
= Модули = | = Модули = <!--T:65--> | ||
Начиная с версии 2.0, в движке правил wb-rules появилась поддержка подключаемых JS-модулей (похожая по поведению на | Начиная с версии 2.0, в движке правил wb-rules появилась поддержка подключаемых JS-модулей (похожая по поведению на | ||
аналогичную в Node.js, но с некоторыми особенностями). | аналогичную в Node.js, но с некоторыми особенностями). | ||
== Расположение == | == Расположение == <!--T:66--> | ||
<!--T:67--> | |||
Поиск модулей происходит по следующим путям (в заданном порядке): | Поиск модулей происходит по следующим путям (в заданном порядке): | ||
<!--T:68--> | |||
* /etc/wb-rules-modules | * /etc/wb-rules-modules | ||
* /usr/share/wb-rules-modules | * /usr/share/wb-rules-modules | ||
<!--T:69--> | |||
Таким образом, пользовательские модули удобно складывать в /etc/wb-rules-modules. | Таким образом, пользовательские модули удобно складывать в /etc/wb-rules-modules. | ||
<!--T:70--> | |||
Добавить свои пути можно редактированием /etc/default/wb-rules добавлением путей | Добавить свои пути можно редактированием /etc/default/wb-rules добавлением путей | ||
к переменной WB_RULES_MODULES через разделитель (:): | к переменной WB_RULES_MODULES через разделитель (:): | ||
<!--T:71--> | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
... | ... | ||
Строка 254: | Строка 309: | ||
== Подключение модуля к сценарию == | == Подключение модуля к сценарию == <!--T:72--> | ||
<!--T:73--> | |||
Подключение модуля происходит с помощью функции require(). Она возвращает объект, экспортированный | Подключение модуля происходит с помощью функции require(). Она возвращает объект, экспортированный | ||
модулем (exports). | модулем (exports). | ||
<!--T:74--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
... | ... | ||
Строка 265: | Строка 322: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:75--> | |||
При этом движок правил будет искать файл myModule.js по очереди в директориях поиска (см. Расположение). | При этом движок правил будет искать файл myModule.js по очереди в директориях поиска (см. Расположение). | ||
<!--T:76--> | |||
Также допустим поиск файла модуля по поддиректориям в директориях поиска, тогда вызов будет выглядеть так: | Также допустим поиск файла модуля по поддиректориям в директориях поиска, тогда вызов будет выглядеть так: | ||
<!--T:77--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
... | ... | ||
Строка 276: | Строка 336: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:78--> | |||
После того, как файл будет найден, его содержимое будет выполнено, и из файла будет передан объект exports. | После того, как файл будет найден, его содержимое будет выполнено, и из файла будет передан объект exports. | ||
<!--T:79--> | |||
'''Примечание 1:''' если модуль был подключен в одном сценарии несколько раз (несколько вызовов require("myModule")), | '''Примечание 1:''' если модуль был подключен в одном сценарии несколько раз (несколько вызовов require("myModule")), | ||
содержимое файла модуля будет выполнено только в первый раз, а при повторных вызовах будет возвращаться сохранённый | содержимое файла модуля будет выполнено только в первый раз, а при повторных вызовах будет возвращаться сохранённый | ||
объект exports. | объект exports. | ||
<!--T:80--> | |||
'''Примечание 2:''' если модуль подключается в разных сценариях, для каждого сценария будет создан свой объект модуля | '''Примечание 2:''' если модуль подключается в разных сценариях, для каждого сценария будет создан свой объект модуля | ||
и заново выполнен весь код модуля. Если модулю требуется использовать данные, общие для всех файлов сценариев, | и заново выполнен весь код модуля. Если модулю требуется использовать данные, общие для всех файлов сценариев, | ||
Строка 287: | Строка 350: | ||
== Создание модуля == | == Создание модуля == <!--T:81--> | ||
<!--T:82--> | |||
Для создания модуля достаточно создать файл с именем, соответсвующим имени модуля (с расширением .js) в директории | Для создания модуля достаточно создать файл с именем, соответсвующим имени модуля (с расширением .js) в директории | ||
/etc/wb-rules-modules. | /etc/wb-rules-modules. | ||
<!--T:83--> | |||
В этом файле будут доступны все стандартные функции wb-rules, а также набор специальных объектов, с помощью | В этом файле будут доступны все стандартные функции wb-rules, а также набор специальных объектов, с помощью | ||
которого можно реализовать необходимый функционал модуля. | которого можно реализовать необходимый функционал модуля. | ||
=== Объект exports === | === Объект exports === <!--T:84--> | ||
<!--T:85--> | |||
С помощью объекта exports можно передавать пользовательскому сценарию параметры и методы. | С помощью объекта exports можно передавать пользовательскому сценарию параметры и методы. | ||
==== Пример ==== | ==== Пример ==== <!--T:86--> | ||
<!--T:87--> | |||
Файл модуля /etc/wb-rules-modules/myModule.js | Файл модуля /etc/wb-rules-modules/myModule.js | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
Строка 309: | Строка 376: | ||
}; | }; | ||
<!--T:88--> | |||
exports.answer = 42; | exports.answer = 42; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:89--> | |||
Файл сценария scenario.js | Файл сценария scenario.js | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
Строка 319: | Строка 388: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:90--> | |||
'''Будьте внимательны:''' объект exports можно '''только дополнять значениями''', но не переопределять. | '''Будьте внимательны:''' объект exports можно '''только дополнять значениями''', но не переопределять. | ||
Иначе значения экспортированы не будут! | Иначе значения экспортированы не будут! | ||
<!--T:91--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
exports = function(text) { | exports = function(text) { | ||
Строка 327: | Строка 398: | ||
}; | }; | ||
<!--T:92--> | |||
// Ожидание: | // Ожидание: | ||
var m = require("my-module"); | var m = require("my-module"); | ||
m("world"); // не работает | m("world"); // не работает | ||
<!--T:93--> | |||
// На практике m будет пустым объектом. | // На практике m будет пустым объектом. | ||
// Та же проблема произойдёт при использовании такой конструкции: | // Та же проблема произойдёт при использовании такой конструкции: | ||
Строка 342: | Строка 415: | ||
=== Объект module === | === Объект module === <!--T:94--> | ||
<!--T:95--> | |||
Объект module содержит параметры, относящиеся непосредственно к файлу модуля. | Объект module содержит параметры, относящиеся непосредственно к файлу модуля. | ||
==== module.filename ==== | ==== module.filename ==== <!--T:96--> | ||
<!--T:97--> | |||
Содержит полный путь до файла ''модуля''. Например, для модуля, сохранённого в /etc/wb-rules-modules/myModule.js: | Содержит полный путь до файла ''модуля''. Например, для модуля, сохранённого в /etc/wb-rules-modules/myModule.js: | ||
<!--T:98--> | |||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
log(module.filename); // выведет /etc/wb-rules-modules/myModule.js | log(module.filename); // выведет /etc/wb-rules-modules/myModule.js | ||
Строка 356: | Строка 432: | ||
==== module.static ==== | ==== module.static ==== <!--T:99--> | ||
<!--T:100--> | |||
Объект, хранящий данные, общие для всех экземпляров данного модуля. Его следует использовать для тех данных, | Объект, хранящий данные, общие для всех экземпляров данного модуля. Его следует использовать для тех данных, | ||
которые должны быть доступны сразу во всех сценариях, использующих данный модуль. | которые должны быть доступны сразу во всех сценариях, использующих данный модуль. | ||
<!--T:101--> | |||
Файл /etc/wb-rules-modules/myModule.js | Файл /etc/wb-rules-modules/myModule.js | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
Строка 372: | Строка 450: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:102--> | |||
Файл сценария scenario1.js | Файл сценария scenario1.js | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
Строка 379: | Строка 458: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:103--> | |||
Файл сценария scenario2.js | Файл сценария scenario2.js | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
Строка 387: | Строка 467: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:104--> | |||
В результате работы двух скриптов в логе окажется 5 сообщений: | В результате работы двух скриптов в логе окажется 5 сообщений: | ||
<!--T:105--> | |||
<syntaxhighlight> | <syntaxhighlight> | ||
Number of calls: 1 | Number of calls: 1 | ||
Строка 398: | Строка 480: | ||
=== __filename === | === __filename === <!--T:106--> | ||
<!--T:107--> | |||
Переменная __filename берётся из глобального объекта сценария, к которому подключается модуль, и содержит имя файла | Переменная __filename берётся из глобального объекта сценария, к которому подключается модуль, и содержит имя файла | ||
сценария. | сценария. | ||
<!--T:108--> | |||
В случае, если модуль подключается в другом модуле, переменная __filename, тем не менее, будет содержать именно | В случае, если модуль подключается в другом модуле, переменная __filename, тем не менее, будет содержать именно | ||
имя файла сценария - вершины дерева зависимостей. | имя файла сценария - вершины дерева зависимостей. | ||
<!--T:109--> | |||
Файл /etc/wb-rules-modules/myModule.js | Файл /etc/wb-rules-modules/myModule.js | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
Строка 413: | Строка 498: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:110--> | |||
Файл сценария /etc/wb-rules/scenario1.js | Файл сценария /etc/wb-rules/scenario1.js | ||
<syntaxhighlight lang="js"> | <syntaxhighlight lang="js"> | ||
Строка 419: | Строка 505: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
= Замеры производительности = | = Замеры производительности = <!--T:111--> | ||
Cм. [[Special:MyLanguage/Движок_правил_wb-rules_2.0/Производительность|Замеры производительности]] | Cм. [[Special:MyLanguage/Движок_правил_wb-rules_2.0/Производительность|Замеры производительности]] | ||
</translate> | </translate> |
правки