2011-11-14 165 views
5

我想展示一些通過Ajax加載的亞馬遜產品。Rails - 非阻塞HTTP請求?

我使用Ajax調用下面的方法,但請求需要幾秒鐘。

@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 

我沒有看到這個操作阻止了服務器。我試圖讓該網站在另一個選項卡中打開。該選項卡不會開始加載,直到第一個帶有Ajax調用的選項卡完成。

我該如何解決這個問題?


設置:

的Ubuntu 10.10
的Rails 3.1.1
的Ruby 1.9.2
寶石:https://github.com/hakanensari/amazon_product

回答

0

編輯:

只是爲了澄清,這取決於你在開發環境中使用的服務器,它不是rails。

WebRick(dev中的默認http服務器)只能處理一個請求。在部署應用程序時,您應該使用美洲獅,獨角獸,Phusion Passenger或具有多個進程(或線程)處理請求的其他服務器。

OLD答案:

我不認爲這是可能的軌道。

我將如何解決這個問題的方法是創建一個簡單的sinatra-synchrony應用程序,只爲獲取你從亞馬遜想要的產品的行動。

爲了能夠發送ajax請求到這個應用程序,你需要將這個應用程序指向你的域(子域)。

我目前沒有看到任何其他解決方案。當然,您的服務器上可以有多個應用程序進程,但這不會長期解決您的問題。

所以包裹起來:

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

哦,這是有點令人失望:( – Frexuz

2

我懷疑這個塊,因爲你正在做你在開發模式下測試,使用默認的Rails斷絕,使用WEBrick。

我的理解是,使用WEBrick只能一次處理一個請求(這就是爲什麼它不用於生產用途的建議)。

一個生產水平的Rails斷絕一樣的Phusion客運,或雜種/瘦服務器集羣,將讓你的併發:)