如何在应用程序的其余部分继续运行时让控制器等待延迟作业?

(这个问题是如何处理Rails应用程序的长请求以便其他用户不会延迟过多的后续问题? )

用户向我的Rails应用程序提交答案,并在后端检查最多10秒。 这会导致所有其他用户的延迟,所以我正在尝试使用delayed_job gem将检查移动到Worker进程。 Worker代码将结果返回给控制器。 但是,控制器没有意识到应该耐心等待结果,因此会导致错误。

如何让控制器等待结果并让应用程序的其余部分同时处理简单的请求?
在Javascript中,可以使用回调来调用函数而不是返回值。 我应该在Ruby中做同样的事情并从Worker回调控制器吗?

更新:
或者,如何从Worker调用控制器方法? 然后我可以在完成后调用相关的操作。

这是相关代码:

控制器:

def submit question = Question.find params[:question] user_answer = params[:user_answer] @result, @other_stuff = SubmitWorker.new.check(question, user_answer) render_ajax end 

submit_worker.rb:

 class SubmitWorker def check #lots of code... end handle_asynchronously :check end 

使用DJ卸载工作绝对正常,但是让控制器等待响应而不是失败。

您可以在check方法的末尾添加某种forms的回调,以便在作业完成时可以通知您的用户。

您可以在此问题中找到关于执行通知的一些讨论: 推送式通知与使用Rails和jQuery的Facebook相似

或者,您可以让浏览器定期调用控制器操作来检查作业的结果 – 结果理想情况下是ActiveRecord对象。 您可以在这个问题中找到关于定期javascript的讨论: Rails 3等效于periodic_call_remote

我认为你在这里尝试做的事情几乎没有矛盾,因为你在完成时使用delayed_job想要中断控制流(所以你的用户在请求完成之前不想要)。

但是如果你希望你的控制器想要得到结果,那么你不想使用像delayed_job这样的后台进程。

在完成检查后,您可能想要考虑通知用户的不同方式,同时保持后台进程不变。