Волокно Crystal lang и веб-сокет

Я новичок в хрустале. У меня вопрос, может кто поможет.

Я использую фреймворк 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

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

(Только после первого запроса на публикацию)

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


person schumi    schedule 12.08.2016    source источник


Ответы (1)


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

while data = channel.receive?
  socket.send(data.to_h.to_json)
end
person asterite    schedule 12.08.2016
comment
В противном случае я предполагаю, что соединение через веб-сокет закрывается, когда блок заканчивается - person asterite; 12.08.2016