2011-02-18 12 views
8

Tengo una aplicación Rails 3 que usa el método de trabajo demorado para recuperar algunos datos (con un método de clase) cuando el usuario entra en la página. ¿Cómo puedo indicarle al proceso ajax que se ha ejecutado el método de clase (para poder detener el sondeo)?Indica a un proceso de AJAX que el trabajo retrasado ha completado

EDIT:

Para aclarar, yo quiero saber cuando el delayed_job se ha quedado, no cuando el proceso Ajax ha tenido éxito. Entonces quiero pasar el estado de finalización de trabajo retrasado al proceso de ejecutar ajax.

Respuesta

11

Normalmente, la mejor manera de hacerlo es almacenar, en su base de datos, una indicación del progreso del trabajo. Por ejemplo:

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 

Así que cuando encolar el trabajo:

User.update_attributes :calculation_status => 'enqueued' 
User.send_later :perform_calculation 

se puede consultar, en su controlador, el estado del trabajo:

def check_status 
    @user = User.find(params[:id]) 
    render :json => @user.calculation_status 
end 

Usted proceso de ajax de votación simplemente puede llamar a check_status para ver cómo está progresando el trabajo, si ha tenido éxito o si ha fallado.

+0

¡Pan es el hombre! Gracias amigo, esto funcionó como un encanto. Buena idea. –

-2

Si está utilizando cualquier marco de JavaScript como prototypejs, en las opciones opcionales hash, generalmente proporciona una devolución de llamada onComplete y/o OnSuccess. API Reference

+1

¿Pero la llamada no tendrá éxito sin importar el motivo, ya que el trabajo se acaba de poner en cola? – lightyrs

0

Con esta joya que puede tener el seguimiento del progreso directamente en el objeto en sí Delayed::Job: https://github.com/GBH/delayed_job_progress

puestos de trabajo completadas se eliminan ya no de forma automática, por lo que puede sondear contra un puesto de trabajo hasta que se vuelve con completed estado.

Cuestiones relacionadas