Как сломать setinterval в сокетах io - Nodejs - PullRequest
0 голосов
/ 21 октября 2018

Существует API, который отправляет некоторые данные json. Сервер nodejs получает эти данные json и отправляет клиент с веб-сокетом каждые 5 секунд. Если подключение включено, когда соединяется клиент, оно работает, но когда клиент отключается, он не останавливается.

Код

io.on('connection', function(client) {  
        var loop=setInterval(()=>{
            console.log('Client connected...');

            fetch('https://www.foo.com/api/v2/searchAssets')
            .then(res => res.json())
            .then(json => 
            {client.emit('news'{json});console.log(json)}),5000);

        })});

io.on('disconnetion',function(){
                clearInterval(loop);
                console.log("disconnected");
            })

ИЛИ

Есть ли у вас какие-либо другие рекомендации по отправке этих данных json на стороне клиента, кроме websocket?

Заранее спасибоза вашу поддержку

1 Ответ

0 голосов
/ 21 октября 2018

Ваша проблема - это проблема объема.Когда вы объявляете loop var, он является локальным по отношению к обратному вызову события on connection и не существует в событии on disconnect.Основываясь на документе о том, как обрабатывать разъединение , вы можете переместить обработчик разъединения в обработчике соединений следующим образом:

io.on('connection', function(client) {
  // Start the interval
  var loop = setInterval(()=>{
    console.log('Client connected...');

    fetch('https://www.foo.com/api/v2/searchAssets')
      .then(res => res.json())
      .then(json => {
        client.emit('news'{json});console.log(json)
      } ,5000);
  });

  // Handles disconnection inside the on connection event
  // Note this is using `client.on`, not `io.on`, and that
  // your original code was missing the "c" in "disconnect"
  client.on('disconnect', () => {
    clearInterval(loop);
    console.log("disconnected");
  });
});

Но я бы не рекомендовал эту архитектуру, поскольку потоковые данные независимыклиента.Данные могут быть получены один раз и переданы всем.Вот как вы можете это сделать:

var loop

// The function startStreaming starts streaming data to all the users
function startStreaming() {
  loop = setInterval(() => {
    fetch('https://www.foo.com/api/v2/searchAssets')
      .then(res => res.json())
      .then(json => {
        // The emit function of io is used to broadcast a message to
        // all the connected users
        io.emit('news', {json});
        console.log(json);
      } ,5000);
  });
}

// The function stopStreaming stops streaming data to all the users
function stopStreaming() {
  clearInterval(loop);
}

io.on('connection',function() {
  console.log("Client connected");

  // On connection we check if this is the first client to connect
  // If it is, the interval is started
  if (io.sockets.clients().length === 1) {
    startStreaming();
  }
});

io.on('disconnetion',function() {
  console.log("disconnected");

  // On disconnection we check the number of connected users
  // If there is none, the interval is stopped
  if (io.sockets.clients().length === 0) {
    stopStreaming();
  }
});
...