ロングポーリングについて知っている知識
リクエストがサーバに送信する。(ajax or fetch)
サーバはメッセージがあるまで接続を閉じないで待つ(ruby: ここの部分の実装が分からない)
メッセージが現れたら、サーバはそのデータでリクエストに応答する(ruby: renderで返す感じ?(よく分からない))
ブラウザはすぐに新しいリクエストを作る
現状のコード
Post時の該当ソース
slim
1 //divの要素です(擬似インプット) 2 #input.area contenteditable="true" 3 input.btn type="submit" value="post" onclick="send()"
js
1 function send() { 2 var text = document.getElementById("input").textContent; 3 $.ajax({ 4 url: `/dm`, 5 type: "POST", 6 data: {message: {dm: text}}, 7 dataType: "json", 8 }).done(function(data){ 9 console.log(data); 10 console.log(data.dm); 11 }).fail(function(data){ 12 console.log("fail"); 13 }); 14 }
ruby
1class DmController < ApplicationController 2 3 def create 4 dm = Dm.new(params) 5 respond_to do |format| 6 if dm.save 7 format.js 8 format.json { render json: dm } 9 else 10 redirect_to root_path 11 end 12 end 13 end 14 15 private 16 17 def params 18 params.require(:message).permit(:dm).merge(user_info: current_user) 19 end 20end
実現したいこと
リアルタイムに近い通信サービスを作りたく、その手段としてロングポーリングを使って実現したいと考えています。(ショートポーリングの実装はできます)
リアルタイム通信処理をやりたいというと、websokect通信もあると思いますが今回はあくまでもロングポーリングを使った方法を知りたいと考えています。
困っていること
ショートポーリングの実装は、ajaxを定期的に呼び出すことで簡単に実装することができたのですが、ロングポーリングにいては、何をどうしたらよいかが分からない状態でいます。
特にバックエンド側の、メッセージを受け取るまで閉じずに待つという処理が分からないです。(概念は理解できているのですがコードの書き方が分からないです。)
そのため、バックエンド側のコードを交えてご教示いただけると幸いです。
試したこと
動かないですが、私の中でイメージしているロングポーリングの処理です。
ruby
1class DmController < ApplicationController 2 3 def ajax 4 # {message {cnt:9}} パラメーターです。cntはviewに表示されているメッセージの数です。 5 # 例)DBにはメッセージが10こあるとします。 6 dm = Dm.all 7 num = dm.count - params[:message][:cnt].to_i 8 # => 1 9 dm.last(num) 10 respond_to do |format| 11 if dm.present? 12 format.js 13 format.json { render json: dm } 14 else 15 wait 16 end 17 end 18 end 19 20 def wait dm = nil 21 sleep(60) if dm.blank? # sleepをkillしてjsonを返す 22 respond_to do |format| 23 format.js 24 format.json { render json: dm } 25 end 26 end 27 28 def create 29 dm = Dm.new(params) 30 respond_to do |format| 31 if dm.save 32 wait(dm) 33 else 34 redirect_to root_path 35 end 36 end 37 end 38 39 private 40 41 def params 42 params.require(:message).permit(:dm).merge(user_info: current_user) 43 end 44end
更新をバックエンドで待ち続ける時
ruby
1#dmは取得したレコード 2loop do 3break if dm.present? 4sleep 0.1 5end
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/14 01:56 編集
2019/11/14 02:17
2019/11/14 03:05
2019/11/14 05:47
2019/11/15 00:47
2019/11/15 01:49 編集
2019/11/15 02:08
2019/11/15 02:20
2019/11/15 04:38
2019/11/15 04:41
2019/11/15 05:08
2019/11/16 07:05