Sinatra Streaming Responses

2023-12-20 15:43 更新

有時(shí)候,想要在開始發(fā)送數(shù)據(jù)時(shí)依然生成一些響應(yīng)體??紤]一個(gè)極端的例子,在客戶端關(guān)閉連接之前,一直發(fā)送數(shù)據(jù)??梢允褂昧鬏o助方法來避免自己創(chuàng)建包裝方法。

get '/' do
  stream do |out|
    out << "It's gonna be legen -\n"
    sleep 0.5
    out << " (wait for it) \n"
    sleep 1
    out << "- dary!\n"
  end
end

可以使用 stream 方法實(shí)現(xiàn)流式 API,服務(wù)器發(fā)送事件以及用作 WebSocket 的基礎(chǔ)。該方法同樣也可用來提高速度,如果只有部分內(nèi)容依賴緩慢的資源。

注意:流式行為,特別是并發(fā)請(qǐng)求的數(shù)據(jù),高度依賴用來提供應(yīng)用的 web 服務(wù)器。有些服務(wù)器,比如 WEBRick,根本不支持流。如果服務(wù)器不支持流,當(dāng)傳遞給流的塊結(jié)束執(zhí)行時(shí),響應(yīng)體將會(huì)被立即返回。流并不是包治百病的萬金油。

如果可選的參數(shù)設(shè)置為?keep_open?, 不會(huì)自動(dòng)對(duì)流對(duì)象調(diào)用 close 方法,而是允許在隨后的執(zhí)行流中手動(dòng)關(guān)閉。這近對(duì)那些時(shí)間驅(qū)動(dòng)的服務(wù)器 (Thin,Rainbows) 起作用,其他服務(wù)器依然會(huì)關(guān)閉流。

# long polling

set :server, :thin
connections = []

get '/subscribe' do
  # register a client's interest in server events
  stream(:keep_open) { |out| connections << out }

  # purge dead connections
  connections.reject!(&:closed?)

  # acknowledge
  "subscribed"
end

post '/message' do
  connections.each do |out|
    # notify client that a new message has arrived
    out << params[:message] << "\n"

    # indicate client to connect again
    out.close
  end

  # acknowledge
  "message received"
end


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)