- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
(此问题是 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
submit_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/
我是一名优秀的程序员,十分优秀!