@angelzzz

Как из node.js эмитить через socket.io данные из ответа с интервалами?

Мне нужно сделать «фильм» (под «фильмом» я понимаю изменяющиеся страницы каждый N секунд) с помощью JS.

У меня есть массив объектов в node.js, с помощью socket.io я хочу эмитить (emit) контент этих объектов каждые N секунд в React.

Есть вот такой API endpoint:

router.get("/start/:handle", (req, res) => {
  Game
    .findOne({ url: req.params.handle })
    .then(game => {
      let questionList = [];
      game.blocks.map(block => {
        block.questions.map(question => {
          questionList.push(question)
        })
      })

      questionList.map(question => {
        return setInterval(
          res.status(200).send(question)
          , 5000);
      })
    })
    .catch(err => console.log("start game, err =>", err))
})


Но это не работает. Получаю ошибку:

TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Вероятно, это нужно делать как-то по другому. Но я не приложу ума как это сделать

Вы сейчас, наверное, будете сильно удивлены, но для соединения с помощью Socket.IO, надо подключить и использовать библиотеку Socket.IO.

Изучить вопрос самостоятельно можно по этой ссылке.

Ошибка у вас из-за неправильного использования setInterval, вы вместо колбека передаете туда результат выполнения send.

Вместо:
setInterval(foo(bar), duration);

Надо:
setInterval(() => {
  foo(bar);
}, duration);


Ну и для возможности остановить его выполнение его надо хранить и чистить по определенному условию:
const interval = setInterval(() => {
  foo(bar);
  if (someCondition()) {
    clearInterval(interval);
  }
}, duration);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы