(此问题是 How do I handle long requests for a Rails App so other users are not delayed too much? 的后续问题)
用户向我的 Rails 应用程序提交答案,该答案会在后端进行长达 10 秒的检查。这会导致所有其他用户延迟,因此我正在尝试 delayed_job gem 将检查移至工作进程。 Worker 代码将结果返回给 Controller 。然而, Controller 没有意识到它应该耐心等待结果,因此会导致错误。
如何让 Controller 等待结果并让应用程序的其余部分同时处理简单的请求?
在 Javascript 中,我们可以使用回调来调用函数而不是返回值。我应该在 Ruby 中做同样的事情并从 Worker 回调 Controller 吗?
更新:
或者,如何从 Worker 调用 Controller 方法?然后我就可以在完成后调用相关操作。
这是相关代码:
Controller :
def submit
question = Question.find params[:question]
user_answer = params[:user_answer]
@result, @other_stuff = SubmitWorker.new.check(question, user_answer)
render_ajax
end
提交_worker.rb:
class SubmitWorker
def check
#lots of code...
end
handle_asynchronously :check
end
最佳答案
使用 DJ 来卸载工作绝对没问题,也很正常,但让 Controller 等待响应就违背了要点。
您可以在 check
方法的末尾添加某种形式的回调,以便在作业完成时通知您的用户。
您可以在这个问题中找到一些有关执行通知的讨论:push-style notifications simliar to Facebook with Rails and jQuery
或者,您可以让浏览器定期调用 Controller 操作来检查作业结果 - 理想情况下,结果是 ActiveRecord 对象。同样,您可以在这个问题中找到有关周期性 javascript 的讨论:Rails 3 equivalent for periodically_call_remote
关于ruby-on-rails - 如何让 Controller 等待延迟的作业,而应用程序的其余部分继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18090760/