класс ActiveSupport::ExecutionWrapper
Публичные методы класса
# File activesupport/lib/active_support/execution_wrapper.rb, line 50
def self.register_hook(hook, outer: false)
if outer
to_run RunHook.new(hook), prepend: true
to_complete :after, CompleteHook.new(hook)
else
to_run RunHook.new(hook)
to_complete CompleteHook.new(hook)
end
end Зарегистрировать объект для вызова на этапах run и complete.
hook.complete будет передано значение, возвращённое hook.run, и оно будет вызвано, только если ранее был вызван run. (В основном это означает, что оно не будет вызвано, если в предшествующем блоке to_run возникнет исключение; в такой ситуации вызываются все обычные блоки to_complete.)
# File activesupport/lib/active_support/execution_wrapper.rb, line 66
def self.run!(reset: false)
if reset
lost_instance = IsolatedExecutionState.delete(active_key)
lost_instance&.complete!
else
return Null if active?
end
new.tap do |instance|
success = nil
begin
instance.run!
success = true
ensure
instance.complete! unless success
end
end
end Выполнить этот процесс.
Возвращает экземпляр, метод complete! которого должен быть вызван после выполнения работы.
По возможности используйте wrap.
# File activesupport/lib/active_support/execution_wrapper.rb, line 21 def self.to_complete(*args, &block) set_callback(:complete, *args, &block) end
# File activesupport/lib/active_support/execution_wrapper.rb, line 17 def self.to_run(*args, &block) set_callback(:run, *args, &block) end
# File activesupport/lib/active_support/execution_wrapper.rb, line 86
def self.wrap(source: "application.active_support")
return yield if active?
instance = run!
begin
yield
rescue Exception => error
error_reporter&.report(error, handled: false, source: source)
raise
ensure
instance.complete!
end
end Выполнить работу в предоставленном блоке как процесс.
Публичные методы экземпляра
# File activesupport/lib/active_support/execution_wrapper.rb, line 135 def complete! complete ensure IsolatedExecutionState.delete(self.class.active_key) end
Завершить выполняющийся процесс. Этот метод должен быть вызван ровно один раз для результата любого вызова run!.
По возможности используйте wrap.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.