Module: ActionCable::Channel::PeriodicTimers::ClassMethods

Defined in:
actioncable/lib/action_cable/channel/periodic_timers.rb

Instance Method Summary collapse

Instance Method Details

#periodically(callback_or_method_name = nil, every:, &block) ⇒ Object

Периодически выполняет задание на канале, например, обновление счетчика онлайн-пользователей, опрос внутреннего сервера для получения новых статусов, отправку регулярных “heartbeat” сообщений или выполнение некоторой внутренней работы и предоставление информации об обновлениях.

Передайте имя метода или аргумент lambda или предоставьте блок для вызова. Укажите период вызова в секундах, используя аргумент ключевого слова every:.

periodically :transmit_progress, every: 5.seconds

periodically every: 3.minutes do
  transmit action: :update_count, count: current_count
end

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'actioncable/lib/action_cable/channel/periodic_timers.rb', line 29

def periodically(callback_or_method_name = nil, every:, &block)
  callback =
    if block_given?
      raise ArgumentError, 'Pass a block or provide a callback arg, not both' if callback_or_method_name
      block
    else
      case callback_or_method_name
      when Proc
        callback_or_method_name
      when Symbol
        -> { __send__ callback_or_method_name }
      else
        raise ArgumentError, "Expected a Symbol method name or a Proc, got #{callback_or_method_name.inspect}"
      end
    end

  unless every.kind_of?(Numeric) && every > 0
    raise ArgumentError, "Expected every: to be a positive number of seconds, got #{every.inspect}"
  end

  self.periodic_timers += [[ callback, every: every ]]
end