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

但是结果只发送到 web socket 一次。

(仅在第一次发布请求后)

我该如何解决?

4

1 回答 1

2

我不是 kemal 专家,我不知道您的预期行为是什么,但是如果您想在每次有人发布到“/posts”时向 websocket 发送一条消息,我会创建一个循环:

while data = channel.receive?
  socket.send(data.to_h.to_json)
end
于 2016-08-12T14:13:03.520 回答