[Nitro] de-bouncing Submit Order button

Bill Kelly billk at cts.com
Wed Oct 10 18:32:21 EDT 2007

From: George Moschovitis 
> I am not sure I understand your polling idea :(

The polling idea was a method of presenting an, 
"We are processing your order, this may take a moment..."
page, while the server is completing the purchase in an
asynchronous thread.  (Also it was conceived as a way of
eliminating special cases, in that every (possible)
multiple click of the Submit button goes through the same

The processing_order page polls "itself" with a 

  <meta http-equiv="refresh" content="3" />
and as long as the server is still busy processing the
order, the page remains at the "...this may take a moment."
page.  But when it polls and the order is complete, then
its Controller redirects to a final order complete, or
purchase failed page.

The logic for the refresh page looks like this:

  # This is a meta-refresh holding page... the user can click the Submit button on
  # final_review as much as they like, and they'll end up here
  def processing_order
    do_process_order = false
    $order_sync_mutex.synchronize {
      if session[:order_process_state].nil?
        session[:order_process_state] = :in_process
        do_process_order = true

    if do_process_order
      sleep 2.0  # if it hasn't completed by this time, we'll show the "This may take a moment..." page

    order_state = $order_sync_mutex.synchronize { session[:order_process_state] }
    case order_state
    when :complete then redirect :order_complete
    when :fail     then redirect :purchase_error
    else                # continue and display the processing_order meta refresh html

So, everytime processing_order is invoked, it checks the
session[:order_process_state] value.  If we haven't begun
processing the order yet, it knows to kick off the async
processing.  Regardless, it always checks the current
session[:order_process_state] at the end, to determine
whether to remain on the "This may take a moment" polling
page, or proceed to the purchase succeeded/failed pages.

Does that make sense and/or seem reasonable?



More information about the Nitro-general mailing list