I have开发者_开发知识库 a Rails 3 app that uses delayed_job to fetch some data (with a class method) when the user hits the page. How can I indicate to the ajax process that the class method has run (so that I can stop polling)?
EDIT:
To clarify, I want to know when the delayed_job has run, not when the ajax process has succeeded. Then I want to pass the delayed_job completed status to the running ajax process.
Typically, the best way to do this is to store, in your database, an indication of the job's progress. For instance:
class User
def perform_calculation
begin
self.update_attributes :calculation_status => 'started'
do_something_complex
self.update_attributes :calculation_status => 'success'
rescue Exception => e
self.update_attributes :calculation_status => 'error'
end
end
end
So that when you enqueue the job:
User.update_attributes :calculation_status => 'enqueued'
User.send_later :perform_calculation
You can query, in your controller, the status of the job:
def check_status
@user = User.find(params[:id])
render :json => @user.calculation_status
end
You polling ajax process can then simply call check_status to see how the job is progressing, if it has succeeded or if it has failed.
With this gem you can have progress tracking directly on the Delayed::Job
object itself: https://github.com/GBH/delayed_job_progress
Completed jobs are no longer automatically removed, so you can poll against a job until it comes back with completed
state.
If you are using any JavaScript framework like prototypejs, then in the optional options hash, you usually provide a onComplete and/or onSuccess callback. API Reference
精彩评论