我需要在渲染页面后对远程服务做请求
我的控制器:
after_filter :remote_action, only: :update
def update
@res = MyService.do_action foo, bar
return render json: @res[:json], status: @res[:status] unless @res[:success]
end
def remote_action
# There is remote http request
end
我需要在渲染页面后调用remote_action方法
答案 0 :(得分:10)
after_filter
在模板转换为html后运行,但之前 html作为对客户端的响应发送。因此,如果您正在做一些像制作远程http请求那样慢的事情,那么这会降低您的响应速度,因为它需要等待远程请求完成:换句话说,远程请求将阻止您的响应。
为了避免阻塞,你可以分叉另一个线程:看看
https://github.com/tra/spawnling
使用此功能,您只需将代码更改为
即可def remote_action
Spawnling.new do
# There is remote http request
end
end
在回复响应之前仍会触发远程调用,但由于它已被分叉到新线程中,响应不会等待远程请求返回,它将会马上发生。
您还可以查看https://github.com/collectiveidea/delayed_job,它将作业放入数据库表,其中一个单独的进程将它们拉出并执行它们。