JavaScript HTML 5 eventsource.addeventlistener 监听一个地址,数据返回不出

bighuzi · 2016年01月27日 · 最后由 hegwin 回复于 2017年01月10日 · 2643 次阅读

app/views/home/index.html.erb 代码如下

<h2>Recently updated posts</h2>

<table>
  <thead>
    <tr>
      <th>Title</th>
    </tr>
  </thead>

  <tbody>
    <% @posts.each do |post| %>
      <tr>
        <td><%= post[:title] %></td>
      </tr>
      <tr>
        <td><%= post[:id] %></td>
      </tr>
    <% end %>
  </tbody>
</table>
<script type="text/javascript">
$(function(){
  var source = new EventSource('/home/aaa');
  var message;
  source.addEventListener("upstream", function(e){
    message = e.data;
    alert(message);
  }, false );
})

</script>
require 'server_sent_event/sse'
class HomeController < ApplicationController
  include ActionController::Live
  def index
    @posts = RecentPosts.list
  end

  def aaa
    response.headers['Content-Type'] = 'text/event-stream'
    # sse = Sse.new(response.stream)
    # # RecentPosts.list.each do | r |
    # #   puts r[:title]
    # # end
    # sse.write({name: 'Test'}, event: "event_name")
    # render nothing: true
    # begin

    # rescue IOError
    #   # Client Disconnected
    # ensure
    #   sse.close
    # end
    response.stream.write('event: upstream')
    response.stream.write('data: pricess started')
    render nothing: true
  rescue IOError
    logger.info 'stream close'
  ensure
    response.stream.close

  end
end

监听器中监听不到数据。。。

贴代码,不要截图!

2 楼 已删除

猜测:

response.stream.write('event: upstream\n')
response.stream.write('data: pricess started\n\n')

挖个坟,最近也玩了下ActionController::Live,在论坛上搜资料,然后发现了这个帖子,来回答下。

所谓 SSE,就是浏览器向服务器发送一个 HTTP 请求,然后服务器不断单向地向浏览器推送“信息”(message)。这种信息在格式上很简单,就是“信息”加上前缀“data: ”,然后以“\n\n”结尾

所以 @chucai 的回答是对的,是你在服务器端传回来的格式不对。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号