2011-11-14 23 views
5

Desidero visualizzare alcuni prodotti Amazon, caricati tramite Ajax.Rails: richieste HTTP non bloccanti?

Io chiamo il metodo di seguito con Ajax, ma la richiesta richiede un paio di secondi.

@items = [] 
@shows.shuffle.first(5).each do |show| 
    req = AmazonProduct["us"] 
    req.configure do |c| 
     c.key = "###" 
     c.secret = "###" 
     c.tag = "###" 
    end 
    req << { :operation => 'ItemSearch', 
      :search_index => params[:product_type], 
      :response_group => %w{ItemAttributes Images}, 
      :keywords => show.name, 
      :sort => "" } 
    resp = req.get 
    @items << resp.find('Item').shuffle.first 
end 

Non ho notato che questa azione blocca il server. Ho provato ad aprire il sito in un'altra scheda. Quella scheda non inizierà il caricamento fino al completamento della prima scheda con la chiamata Ajax.

Come posso risolvere questo problema?


Setup:

Ubuntu 10.10
Rails 3.1.1
Rubino 1.9.2
Gem: https://github.com/hakanensari/amazon_product

risposta

0

EDIT:

Giusto per chiarire, esso dipende dal server che usi nel tuo ambiente di sviluppo, non è binari.

WebRick (server HTTP predefinito in dev) può gestire solo una richiesta alla volta. Quando distribuisci la tua applicazione dovresti usare puma, unicorno, Phusion Passenger o qualsiasi altro server che abbia più di un processo (o thread) per gestire le tue richieste.

Risposta VECCHIO:

Non credo che questo è possibile in rotaie.

Il modo in cui vorrei affrontare questo problema è quello di creare una semplice app sinatra-synchrony che ha solo azione per il recupero di prodotti che si desidera da Amazon.

Per poter inviare una richiesta Ajax a questa app, è necessario indirizzare questa app al proprio dominio (sottodominio).

Al momento non vedo altre soluzioni. Naturalmente puoi avere più di un processo di applicazione sul tuo server, ma questo non risolverà il tuo problema a lungo termine.

Quindi per concludere:

AJAX -> amazon-producs-sinatra-app.yourdomain.com 
+0

Oh, questo è un po 'deludente :( – Frexuz

2

Ho il sospetto che questo blocca perché si sta facendo il test in modalità di sviluppo, utilizzando le rotaie di default sever, WEBrick.

La mia comprensione è che webrick può elaborare solo una richiesta alla volta (motivo per cui non è consigliata per l'utilizzo in produzione).

A Rails livello di produzione sever, come Phusion passeggeri, o di un cluster di server bastardi/sottili, ti porterà la vostra concorrenza :)