Кристаллическое волокно и сетчатое гнездо

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

Я использую Kemal Framework. Иметь этот код:

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

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

(Только после первого поста запроса)

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

1 ответ

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

while data = channel.receive?
  socket.send(data.to_h.to_json)
end
Другие вопросы по тегам