ruby-on-rails – 在Rails 4中将进度消息从服务器传递到前端
我正在开发一个Rails应用程序,该应用程序具有自定义回形针处理器,可接受视频文件并将其操作为各种其他格式.
当我正在使用视频时,这个过程需要一段时间才能在服务器上完成,我想将有关处理状态的信息从服务器传递到前端,因为它正在发生. 我的问题是:在没有页面重新加载的情况下,从我的自定义回形针类到我的JS获取这些消息的最佳方法是什么?我猜测某种事件发布/子系统,但我不清楚实现它的最佳方法. 对不起,如果这是一个noob问题,离开Rails一段时间了! 解决方法
你的问题相对模糊,如果我的答案是平等的,那么道歉:
WebSockets或SSE(服务器发送事件) 我们刚刚使用一个删除多个记录的应用程序实现了与此类似的功能,并发送已删除的更新 你对pub / sub是对的,我会尝试解释底层技术.它实际上是SSE或WebSockets的类似过程 接收“实时”数据 从服务器接收“实时”数据的过程是使用Rails中的ActionController::Live控制器.这适用于response.headers [‘Content-Type’] =’text / event-stream’HTTP mime-type,用于将小数据包发送到Javascript“监听器”(您在前端初始化) 无论您使用SSE还是WebSockets,您都必须有一个“实时”控制器操作(创建实时信息),并且还有一个Javascript EventListener用于在浏览器中捕获实时数据 你这样做的方式随着每种技术的变化而变化,但实际上它对于SSE和SSE来说都是类似的过程.的WebSockets 上证所 Server Sent Events是一种HTML5技术,它基本上允许您通过在服务器上打开与端点(您的Rails ActionController :: Live操作)的异步连接来接收(而不是发送)更新的数据,这将发布您需要的数据 您通常使用Redis(将数据编译为JSON)并使用Rails的ActionController :: Live功能发送它.您的Javascript将“监听”正在触发的事件,从而允许您捕获从服务器发送的实时数据.在前端操纵它 SSE的问题在于它使用long-polling来持续“ping”端点以试图获取最新信息.虽然Puma允许多线程,但我们无法让它同时运行连接,显着降低性能(基本上,每秒发送一个请求会占用你的连接) 的WebSockets Websockets是与SSE类似的技术,但有一个主要区别 – 它们允许永久连接:
这意味着您可以发送和接收数据,也可以仅连接一次&无论你做什么过渡,都要保持连通性.我们发现这是一个比SSE更稳定的解决方案,因为它消除了长轮询的要求,并且,如果您可以保持身份验证正确,则使您能够正确接收数据 所有大型击球手都使用WebSockets(包括StackOverflow),实际上设置起来相对简单: “实时”设置 你需要: > Rails ActionController :: Live Function&终点(路线) 这是我们使用的一些实时代码: #app/controllers/resources_controller.rb (inherited resources) def destroy element = @resource.find(params[:id]) element.destroy Pusher['private-user-' + current_user.id.to_s].trigger('my_event',{ message: "Removed #{element.title}" }) end #app/assets/javascripts/users.js.coffee.erb pusher = new Pusher("******************",cluster: 'eu' ) channel = pusher.subscribe("private-user-#{gon.user_id}") channel.bind "my_event",(data) -> alert data.message 这将打开与推送应用程序的持久连接,然后推送应用程序处理我们的数据.只要推送器收到我们的数据,它就会将更新发送给我们,允许我们提醒用户该消息 我知道这是一个简单的概述,但我希望它有所帮助 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |