套接字发射过多次,无法将其关闭

时间:2019-06-18 12:36:38

标签: angular socket.io

我正在尝试使用socket.io在我网站上的聊天模块中的用户之间发送消息。

消息运行正常,但是行为很奇怪,它来自我将socket.io的jquery文档翻译成javascript的方式。

第一个发送一次。 第二个很好。 第三两次。 第四三次。 等。

例如,如果我输入:foo, void, int, double,则会显示:

foo

无效

无效

int

int

int

到目前为止,这是我的代码:

html

<form action="" [formGroup]="messageForm" (ngSubmit)="sendMessage()">
  <input id="message" formControlName="message" #message class="form-control" class="messageInput" autocomplete="off"/>
  <button type="submit" class="btn btn-primary btn-lg btn-block">SEND</button>
</form>

sendMessage() called from html

sendMessage() {
  if (this.messageForm.valid) {
    this.message = this.messageForm.get('message').value;
    this.messageForm.reset();
    this.socket.emit('chat message', this.message);
    this.socket.on('chat message', this.receive);
  }
}

receive = function(msg) {
  console.log('receive called'); // called incrementally over time, 1, 22, 333 etc..
  const li = document.createElement('li');
  document.getElementById('messageList').appendChild(li);
  li.innerHTML = msg;
};

backend

io.on('connection', function(socket){
    socket.on('disconnect', function(){
    });
   socket.on('chat message', function(msg){
        io.emit('chat message', msg);
   });
 });

Here is the socket.io tutorial code for reference

$(function () {
    var socket = io();
    $('form').submit(function(e){
        e.preventDefault(); // prevents page reloading
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
         return false;
    });
    socket.on('chat message', function(msg){
        $('#messages').append($('<li>').text(msg));
    });
});

做完一些研究后,到处“ console.logging”看起来像receive()被指数调用,一次是第一条消息,两次是第二条消息,依此类推。我相信我缺少对return false从socket.io jquery的代码转换为我的Angular适配文件。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

知道了!

this.socket.on('chat message', this.receive);不应位于sendMessage()函数内。它位于套接字初始化中,只需声明一次即可:

try {
    this.socket = io.connect('http://localhost:3000');
    this.socket.on('chat message', this.receive);
  } catch (e) {
      console.log('Could not connect socket.io');
  }