Функция box.once
Выполнение функции при условии, что она раньше не выполнялась. Передаваемое значение проверяется на предмет того, выполнялась ли функция. Если она выполнялась, ничего не происходит. В противном случае вызывается функция.
Пример использования box.once() см. в
vshard-quick-start-storage-code.
{note:warning}
Если при инициализации базы данных возникает ошибка внутри box.once(), можно повторно выполнить неудачный блок
box.once() без остановки базы данных. Для этого удалите объект once из системного спейса _schema. Выполните
box.space._schema:select{}, найдите объект once и удалите его.
{/note}
Когда box.once() используется для инициализации, следует
подождать, пока база данных не будет в нужном состоянии (только для
чтения или для чтения и записи). Для этого см. функции во Вложенный модуль box.ctl.
key(string): значение, которое будет проверятьсяfunction(function): функция- ...: аргументы, которые необходимо передать функции
Пример
В примере показано, как повторно выполнить блок box.once(), содержащий
ключ hello.
Сначала проверьте системный спейс _schema.
В примере спейс _schema содержит два объекта box.once – oncebye и oncehello:
app:instance001> box.space._schema:select{}---- - ['oncebye']- ['oncehello']- ['replicaset_name', 'replicaset001']- ['replicaset_uuid', '72d2d9bf-5d9f-48c4-ba80-9d657e128fee']- ['version', 3, 1, 0]
Удалить oncehello объект:
app:instance001> box.space._schema:delete('oncehello')---- ['oncehello']...
После этого проверьте спейс _schema опять:
app:instance001> box.space._schema:select{}---- - ['oncebye']- ['replicaset_name', 'replicaset001']- ['replicaset_uuid', '72d2d9bf-5d9f-48c4-ba80-9d657e128fee']- ['version', 3, 1, 0]...
Чтобы повторно выполнить функцию, вызовите метод box.once() ещё раз:
app:instance001> box.once('hello', function() end)---...app:instance001> box.space._schema:select{}---- - ['oncebye']- ['oncehello']- ['replicaset_name', 'replicaset001']- ['replicaset_uuid', '72d2d9bf-5d9f-48c4-ba80-9d657e128fee']- ['version', 3, 1, 0]...