1

適切なRedisEMgem(私の場合は「em-hiredis」)を使用してEventMachineリアクターループ内のRedisセットを読み取っていて、一部のRedisセットにカスケードのメンバーが含まれているかどうかを確認する必要があります。私の目的は、空ではないセットの名前を取得することです。

require 'eventmachine'
require 'em-hiredis'

def fetch_queue
  @redis.scard('todo').callback do |scard_todo|
    if scard_todo.zero?
      @redis.scard('failed_1').callback do |scard_failed_1|
        if scard_failed_1.zero?
          @redis.scard('failed_2').callback do |scard_failed_2|
            if scard_failed_2.zero?
              @redis.scard('failed_3').callback do |scard_failed_3|
                if scard_failed_3.zero?
                  EM.stop
                else
                  queue = 'failed_3'
                end 
              end 
            else
              queue = 'failed_2'
            end 
          end 
        else
          queue = 'failed_1'
        end 
      end 
    else
      queue = 'todo'
    end 
  end 
end

EM.run do
  @redis = EM::Hiredis.connect "redis://#{HOST}:#{PORT}"

  # How to get the value of fetch_queue?
  foo = fetch_queue
  puts foo
end

私の質問は、EMに「fetch_queue」の「queue」の値を返してreactorループで使用するように指示するにはどうすればよいですか?fetch_queueの単純な「returnqueue='todo'」、「return queue ='failed_1'」などは、「unexpected return(LocalJumpError)」エラーメッセージになります。

4

1 に答える 1

9

デバッグが大好きなので、もっとメソッドを使用してください。このような他のコードを因数分解しないでください。

とにかく、これは基本的におそらくやりたいことなので、コードを因数分解してテストすることができます。

require 'eventmachine'
require 'em-hiredis'

# This is a simple class that represents an extremely simple, linear state
# machine. It just walks the "from" parameter one by one, until it finds a
# non-empty set by that name. When a non-empty set is found, the given callback
# is called with the name of the set.
class Finder

  def initialize(redis, from, &callback)
    @redis = redis
    @from = from.dup
    @callback = callback
  end

  def do_next
    # If the from list is empty, we terminate, as we have no more steps
    unless @current = @from.shift
      EM.stop # or callback.call :error, whatever
    end

    @redis.scard(@current).callback do |scard|
      if scard.zero?
        do_next
      else
        @callback.call @current
      end
    end
  end

  alias go do_next

end

EM.run do
  @redis = EM::Hiredis.connect "redis://#{HOST}:#{PORT}"

  finder = Finder.new(redis, %w[todo failed_1 failed_2 failed_3]) do |name|
    puts "Found non-empty set: #{name}"
  end

  finder.go
end
于 2012-04-25T05:32:11.727 に答える