【问题标题】:Sinatra event triggered by Rufus Scheduler由 Rufus 调度程序触发的 Sinatra 事件
【发布时间】:2017-09-14 13:10:04
【问题描述】:

尝试从 Rufus 调度程序中发送事件会导致此错误:

{ 70231586340180 rufus-scheduler intercepted an error:
  70231586340180   job:
  70231586340180     Rufus::Scheduler::IntervalJob "2s" {}
  70231586340180   error:
  70231586340180     70231586340180
  70231586340180     NameError
  70231586340180     undefined local variable or method `connections' for main:Object
  70231586340180       picture-frame.rb:31:in `send_event'
  70231586340180       picture-frame.rb:24:in `block in <main>'
...

我似乎无法从 Rufus Job 中访问 connections。我怎样才能解决这个问题?这是我的代码:

require 'sinatra'
require 'rufus-scheduler'
require 'json'


set :server, :thin
connections = []
scheduler = Rufus::Scheduler.new


get '/' do
    erb :index
end

get '/events', provides: 'text/event-stream' do
  stream :keep_open do |out|
    connections << out
    connections.reject!(&:closed?)
  end
end

scheduler.interval '2s' do
    random = (0...8).map { (65 + rand(26)).chr }.join
    send_event('random', { random: random })
end

def send_event(id, body)
  body[:id] = id

  event = "data: #{body.to_json}"
  connections.each { |out| out << event }
end

【问题讨论】:

  • connections 对文件来说是本地的,但在方法中是脱离上下文的(词法范围的变化)。如果您真的必须将其设为实例变量 @connections,这将更改范围,但 @connections 现在将成为 main 上下文中的实例变量,这看起来很笨拙。
  • 另一种方法是将 c 大写,使其成为常数。
  • @engineersmnky 如何将连接放在我的 Sinatra 应用程序的上下文中?

标签: ruby variables scope sinatra rufus-scheduler


【解决方案1】:

这是一个带有全局变量的版本。

如何将连接放在我的 Sinatra 应用程序的上下文中?

抱歉,这个 $connections$scheduler 是在整个 Ruby 进程的上下文中,但对于有限的脚本/服务,没关系。

require 'sinatra'
require 'rufus-scheduler'
require 'json'


set :server, :thin
$connections = []
$scheduler = Rufus::Scheduler.new


get '/' do
    erb :index
end

get '/events', provides: 'text/event-stream' do
  stream :keep_open do |out|
    $connections << out
    $connections.reject!(&:closed?)
  end
end

def send_event(id, body)

  body[:id] = id

  event = "data: #{body.to_json}"
  $connections.each { |out| out << event }
end

$scheduler.interval '2s' do

  random = (0...8).map { (65 + rand(26)).chr }.join
  send_event('random', { random: random })
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多