ruby-on-rails – 在Rails 4中将进度消息从服务器传递到前端

ruby-on-rails – 在Rails 4中将进度消息从服务器传递到前端,第1张

概述我正在开发一个Rails应用程序,该应用程序具有自定义回形针处理器,可接受视频文件并将其 *** 作为各种其他格式. 当我正在使用视频时,这个过程需要一段时间才能在服务器上完成,我想将有关处理状态的信息从服务器传递到前端,因为它正在发生. 我的问题是:在没有页面重新加载的情况下,从我的自定义回形针类到我的JS获取这些消息的最佳方法是什么?我猜测某种事件发布/子系统,但我不清楚实现它的最佳方法. 对不起,如 我正在开发一个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类似的技术,但有一个主要区别 – 它们允许永久连接:

WebSocket is a protocol provIDing full-duplex communications channels
over a single TCP connection

这意味着您可以发送和接收数据,也可以仅连接一次&无论你做什么过渡,都要保持连通性.我们发现这是一个比SSE更稳定的解决方案,因为它消除了长轮询的要求,并且,如果您可以保持身份验证正确,则使您能够正确接收数据

所有大型击球手都使用WebSockets(包括StackOverflow),实际上设置起来相对简单:

“实时”设置

你需要:

> Rails ActionController :: live Function&终点(路线)
>第三方Websocket集成(Pusher)
> JavaScript EventListeners(处理返回的数据)

这是我们使用的一些实时代码:

#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

这将打开与推送应用程序的持久连接,然后推送应用程序处理我们的数据.只要推送器收到我们的数据,它就会将更新发送给我们,允许我们提醒用户该消息

我知道这是一个简单的概述,但我希望它有所帮助

总结

以上是内存溢出为你收集整理的ruby-on-rails – 在Rails 4中将进度消息从服务器传递到前端全部内容,希望文章能够帮你解决ruby-on-rails – 在Rails 4中将进度消息从服务器传递到前端所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1290989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存