我在rails ActionController::Live上遇到问题

最后,我想向用户展示FFMPEG的进度,但是现在我想让这个最小的示例运行:

Rails media_controller.rb:

class MediaController < ApplicationController
  include ActionController::Live

  def stream
    puts "stream function loaded"

      response.headers['Content-Type'] = 'text/event-stream'
      i = 0
      begin
        response.stream.write "data: 1\n\n"
        sleep 0.5
        i += 1
        puts "response... data: " + i.to_s
      end while i < 10
    response.stream.close
  end
end


Javascript:

source = new EventSource("/test/0");
source.addEventListener("message", function(response) {
  // Do something with response.data
  console.log('I have received a response from the server: ' + response);
}, false);


当我导航到该站点时,没有显示JavaScript错误。一旦导航到该站点,就成功调用了MediaController的“ stream” -Action。我可以通过查看服务器控制台来验证这一点。它给了我以下输出。在每个响应线之后,都有500毫秒的延迟,如预期的那样:

stream function loaded
response... data: 1
response... data: 2
response... data: 3
response... data: 4
response... data: 5
response... data: 6
response... data: 7
response... data: 8
response... data: 9
response... data: 10
Completed 200 OK in 5005ms (ActiveRecord: 0.8ms)


在JavaScript方面,它提供了以下输出:

(10x) I have received a response from the server: [object MessageEvent]


但是问题出在这里,它会在5秒钟后同时从服务器发送所有这10条消息!但是,预期的行为是,它应该每0.5秒向我发送1条消息!

那么,我在这里做错了什么?错误在哪里?

javascript - Rails ActionController::Live-一次发送所有内容,而不是异步-LMLPHP

最佳答案

我可以通过使用其他Web服务器来解决此问题。以前我使用thin并找到了Post on SO


  您不能将AC::LiveThin一起使用


可以在这里找到说明:

https://github.com/macournoyer/thin/issues/254#issuecomment-67494889


  Thin不适用于流式处理和ActionController :: Live。
  
  与Thin配合使用的唯一方法是使用异步API:
  https://github.com/macournoyer/thin_async。 Thin正是为这种东西而构建的,并使其可扩展。
  
  或更简单的方法是,使用:https://github.com/SamSaffron/message_bus


因此,切换到另一台服务器解决了该问题:

gem 'puma'


从...开始

rails s Puma

关于javascript - Rails ActionController::Live-一次发送所有内容,而不是异步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35057075/

10-12 12:57