1

Rails バックエンドを持つ角度のあるアプリにメッセージングを追加しようとしています。メッセージングを「リアルタイム」に感じさせるために、$interval ディレクティブを使用してサーバーを呼び出し、5 秒ごとに 2 人のユーザー間の会話を取得しています。また、$watch を使用してメッセージを確認し、オブジェクトが変更されているかどうかを確認しています。変更されている場合は、新しい会話が表示されます。

コード:

$scope.messages = messages.messages

getNewMessage = ->
 conversation.getConverationBetweenTwoUsers($stateParams.userId).then ((messages) ->
  $scope.messages = messages.messages
  ), (error) ->
  $state.reload()


checkForNewMessages = ->
  $interval(getNewMessage, 5000)

$scope.$watch('messages.messages', checkForNewMessages, true)

このアプローチの代わりに websocket を使用する必要がある理由を誰かに説明してもらえますか? また、私がやっていることが悪い考えである場合は、その理由とより良いアプローチを説明してください.

すでに会話をしているユーザーがいて、既存の会話に対応できるソリューションがあることを覚えておいてください。

4

1 に答える 1

1

Websockets を使用すると、真のリアルタイムを実現できます。クライアント側からデータをフェッチする必要はありません。Websocket はサーバーとクライアント間の接続を開き、サーバーが新しいデータを受信するとすぐにクライアントにプッシュできるようにします。

データの送信方法を変更しているだけです。

Websocket を使用すると、クライアントによって新しいメッセージが生成されるたびに、サーバーに送信され、サーバーはその新しいメッセージ イベントをリッスンします。次に、そのメッセージを受信する必要があるすべてのクライアントにイベントを発行することによって、そのメッセージを中継します。

イベントはリッスンされるものであり、ペイロード (つまり、メッセージとユーザー情報) を運ぶことができます。

例: クライアント A: '{user: user123, msg: my message, room: 512}' のペイロードを持つ 'newMsg' イベントを発行します。サーバーは 'newMsg' イベントをリッスンしています。「newMsg」イベントでは、サーバーはそのペイロードをイベントとして発行します。たとえば、socket.emit('512', '{user: 1234, msg: my message}') のようになります。

これで、サーバーに接続され、「512」イベントをリッスンしているすべてのクライアントがメッセージを受信します。サーバーがメッセージをリレーしているときに、会話をキャプチャするために、あらゆる種類のデータベース トランザクションを追加することもできます。

具体的にレールについて話すことはできませんが、ソケット リスナーのセットアップは簡単です。リスナー関数を作成して、特定のイベントをそれに割り当てるだけです。そのイベントがトリガーされると、必要なロジックを実行します。データのフェッチと変更のチェックはありません。

何かのようなもの:

socket.on('myEvent', function(data) {
    //do some cool data stuff
})
于 2015-04-26T04:40:32.057 に答える