当块完成执行时,ruby解释器不会继续执行下一条指令

时间:2018-04-12 00:24:08

标签: ruby-on-rails ruby

我有以下执行顺序。当调用import时,它会调用perform_tasks然后进入on_complete上的redis订阅循环:

class Record < ActiveRecord::Base
  def self.import(params)
    peform_tasks params[:record]
    on_complete
  end

  def self.peform_tasks(record_params)
    record_params.each do |param|
      AddressWorker.perform_async param
    end
  end

  def self.on_complete
    redis.subscribe('address_notifier') do |payload|
      on_post_execute payload
    end
    puts 'BUT WE NEVER GET HERE'
  end

  def self.on_post_execute(payload)
   puts 'Yes we get here'
  end
end

问题是当块完成执行并且on_post_execute运行时,执行不会离开块。而且我们永远不会接受这条线:

puts 'BUT WE NEVER GET HERE'

为什么我们不在阻挡后到达线?

请注意,使用ruby redis gem中的redis.subscribe在这里应该是无关紧要的,因为我到了块,它是一个常规的ruby块。

1 个答案:

答案 0 :(得分:2)

正如您所指出的,redis.subscribe的使用并不完全无关紧要。

此方法是loop,在您unsubscribe之前不会中断。因此,在这种情况下,我并不认为您实际上正在退出该区块,因此您的puts行不会被执行。

  def self.on_complete
    redis.subscribe_with_timeout(5, 'address_notifier') do |payload|
      on_post_execute payload

      redis.unsubscribe
    end
    puts 'Should get here now'
  end

  def self.on_post_execute(payload)
    puts 'Yes we get here'
  end

或者使用subscribe_with_timeout

  def self.on_complete
    redis.subscribe_with_timeout(5, 'address_notifier') do |payload|
      on_post_execute payload
    end
    puts 'Should get here now'
  end

  def self.on_post_execute(payload)
    puts 'Yes we get here'
  end