Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4实时流+;基于订阅的更新_Ruby On Rails_Ruby On Rails 4_Live Streaming - Fatal编程技术网

Ruby on rails Rails 4实时流+;基于订阅的更新

Ruby on rails Rails 4实时流+;基于订阅的更新,ruby-on-rails,ruby-on-rails-4,live-streaming,Ruby On Rails,Ruby On Rails 4,Live Streaming,关于使用ActionController::Live和流式通知给用户,我有几个问题 有没有办法判断流是否关闭或何时不再可写 是否有理由在您的操作中手动关闭流?我见过一些例子,他们会显式地关闭他们的流,但是看着浏览器,它似乎为我处理了这个问题 我有一个用户通知类,我的操作可以订阅该类。在用户控制器的创建操作中,我告诉通知类广播新用户 为了方便这一点,我不得不让小溪保持畅通。我也不知道何时从用户通知取消订阅,因为我不知道流何时关闭(通过浏览器启动) 所以这只会让持久连接保持打开状态,然后一旦有什么东

关于使用ActionController::Live和流式通知给用户,我有几个问题

  • 有没有办法判断流是否关闭或何时不再可写
  • 是否有理由在您的操作中手动关闭流?我见过一些例子,他们会显式地关闭他们的流,但是看着浏览器,它似乎为我处理了这个问题
  • 我有一个用户通知类,我的操作可以订阅该类。在用户控制器的创建操作中,我告诉通知类广播新用户

    为了方便这一点,我不得不让小溪保持畅通。我也不知道何时从用户通知取消订阅,因为我不知道流何时关闭(通过浏览器启动)

    所以这只会让持久连接保持打开状态,然后一旦有什么东西触发了UserNotifier上的广播消息,它的任何一个子层都会触发它的块

    唯一的问题是,我不知道何时取消订阅,在我的代码块中,您可以看到我只是显式地调用sse.write(包装响应流),而响应流又盲目地调用stream.write,而不知道其状态

    更新 我注意到有些人拯救IOError异常,以此来判断客户机何时断开连接。这真的是最好的方法吗

    rescue IOError
        UserNotifier.unsub(...)
    
    ...
    

    您可以使用
    确保
    确保在写入失败、连接关闭或出现问题时关闭流:

    def your_action
      response.headers['Content-Type'] = 'text/event-stream'
    
      begin
        # Do your writing here: response.stream.write("data: ...\n\n")
      rescue IOError
        # When the client disconnects, writing will fail, throwing an IOError
      ensure
        response.stream.close
      end
    end
    
    def your_action
      response.headers['Content-Type'] = 'text/event-stream'
    
      begin
        # Do your writing here: response.stream.write("data: ...\n\n")
      rescue IOError
        # When the client disconnects, writing will fail, throwing an IOError
      ensure
        response.stream.close
      end
    end