2016-08-12 2 views
2

Я новичок в кристалле. У меня вопрос, может быть, кто-то может мне помочь.Хрустальное волокно и сетевое гнездо

Я использую рамку Kemal. этот код:

require "kemal" 
require "json" 

channel = Channel(Card).new 

post "/posts" do |env| 
    json = JSON.parse(env.request.body as String) 

    url = json["url"].to_s 

    spawn do 
    # Slow process 
    page = Scraper.new(url) 
    channel.send(page) 
    end 

    {"url" => url}.to_json 
end 

ws "/" do |socket| 
    data = channel.receive 
    socket.send data.to_h.to_json 
end 

Kemal.run 

Но результат отправляется на веб-сокет только один раз.

(только после того, как первый запрос пост)

Как я могу это исправить?

ответ

2

Я не эксперт по kemal, и я не знаю, каково ваше намеренное поведение, но если вы хотите отправить websocket сообщение каждый раз, когда кто-то отправляется на «/ posts», я бы сделал цикл:

while data = channel.receive? 
    socket.send(data.to_h.to_json) 
end 
+0

В противном случае я предполагаю, что соединение с сетью закрыто, когда блок заканчивается – asterite

Смежные вопросы