W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
有時候,想要在開始發(fā)送數(shù)據(jù)時依然生成一些響應(yīng)體??紤]一個極端的例子,在客戶端關(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 方法實現(xiàn)流式 API,服務(wù)器發(fā)送事件以及用作 WebSocket 的基礎(chǔ)。該方法同樣也可用來提高速度,如果只有部分內(nèi)容依賴緩慢的資源。
注意:流式行為,特別是并發(fā)請求的數(shù)據(jù),高度依賴用來提供應(yīng)用的 web 服務(wù)器。有些服務(wù)器,比如 WEBRick,根本不支持流。如果服務(wù)器不支持流,當(dāng)傳遞給流的塊結(jié)束執(zhí)行時,響應(yīng)體將會被立即返回。流并不是包治百病的萬金油。
如果可選的參數(shù)設(shè)置為?keep_open
?, 不會自動對流對象調(diào)用 close 方法,而是允許在隨后的執(zhí)行流中手動關(guān)閉。這近對那些時間驅(qū)動的服務(wù)器 (Thin,Rainbows) 起作用,其他服務(wù)器依然會關(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號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: