如何在 Rails 中实现方法执行的取消(例如取消外部 API 调用,这需要很长时间)



是否有可能(我认为这是通常的事情)取消请求(也是在此请求后已经在服务器上启动的方法)?

比如说,我从rails应用程序请求在youtube或vimeo上进行视频搜索(在服务器上实现,并直接向vimeo或youtube发出进一步的请求),但后来我决定取消这个搜索,这样我就可以开始一个新的搜索,而不会放弃已经无用的搜索结果的资源。因此,所有请求都是通过 AJAX 完成的。

我想我应该:

  • 要么定义一个全局变量(例如 cancel_req = 4939498348953并且每次当cancell将其设置为我希望取消的方法已知的某个特定ID时,同时只需设置为cancel = nil。因此,在代码中的某些点,只需检查此变量(但是如果第三方 API 调用阻塞持续时间很长,因为它返回的数据非常多,该怎么办?

  • 或者引入 Redis 订阅(我认为它对于这个任务来说有点过度设计)

但这两种方法对我来说听起来都只是一种解决方法。有没有更好的方法来达到这些长时间运行的方法cancel,例如在自己的解决方案中请求第三方 API?

更新:

在带有callbacks的轨道中是否有可能? 也许有yield S?

更新2:

工作流如下:

client -> webserver -> rails-app-server (controller/helper) --->
                                                                |
                                                           foreignAPI  // <-- break execution somewhere here (but of course still handle all other client requests, so - not exiting the application) 
                                                                |  
 client <- webserver <- rails-app-server (controller/helper) <--

似乎您的问题只是阻止呼叫。考虑delayed_job运行异步任务 - 在您的情况下,这些长 API 调用。您可以将配置Delayed::Worker.max_run_time = 10.seconds(或任何时间)设置为您愿意等待的限制,并且您能想到的几乎每个事件都有回调。

最新更新