W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有時(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
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: