Цикл вечного пинга UDP-пакетов в Node.js (интервал 3 с) - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь создать цикл, который будет запускать мой сервер, пинговать Arduino, который будет возвращать данные, когда он получит пакет от моего IP.У меня уже есть коллекция mongoDB, работающая с данными, и я просто застрял в этой точке, когда я хотел бы, чтобы мой сервер начинал пинговать arduino каждые несколько секунд с момента запуска.

Примечание: это действительно моя первая попыткадействительно понимает асинхронный JS и, вероятно, является просто ошибкой нуба.

Код:

const dgram = require('dgram');
const message = Buffer.from('Some bytes');
const clientPing = dgram.createSocket('udp4');

const pinging = true;

function ping() {

  return new Promise ((resolve, reject) => {

    // This chunk
    clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
      clientPing.close();
    });
    // When run on it's own successfully pings the arduino

    const error = false;

    if(error == true) {
      reject('Error');
    } else {
      resolve('Pinged');
    }

  });

}

//Working ping
ping().then().catch(err => console.log(err));

Все вышеперечисленное должно было служить лишь простым доказательством того, что обещание работает и успешно выполняетпакет udp к цели.

function loop() {
  while(pinging == true) {
    setTimeout(() => {
      ping().then().catch(err => console.log(err));
      console.log('Pinged');
    }, 3000);
  }
}

Остальные это просто разные комбинации того, как я пытался решить проблему здесь.Насколько я могу судить, у меня нет утечки памяти, поскольку цикл работает просто без увеличения потребления ресурсов.

function loop() {
  console.log("entered loop")
  while(pinging == true) {
    setTimeout(() => {
      clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
        clientPing.close();
      });
      console.log('Pinged');
    }, 3000);
  }
}

Этот был предназначен для запуска только кода для ping без использования обещания.но все равно не дает желаемого результата.Файл console.log напечатан выше, но, похоже, он никогда не запускает тайм-аут.

loop();

Это просто запускает одну из двух loop() функций.

do {
  setTimeout(() => {
    ping().then().catch(err => console.log(err));
    console.log("pinged");
  }, 2000)
} while(pinging == true)

НаконецЯ думал, что попробую do, но также безуспешно.

Если все они будут вставлены в документ последовательно, он создаст мой файл.Просто раскомментируйте / закомментируйте каждый раздел по мере необходимости.

Я просто упускаю что-то очевидное или есть что-то довольно сложное, что мешает этому работать?

Спасибо!

1 Ответ

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

Ваша функция ping написана неправильно.Это решающее обещание сразу после отправки пинга, а не при обратном вызове.Пожалуйста, измените его следующим образом.

function ping() {
  return new Promise ((resolve, reject) => {

    // This chunk
    clientPing.send("Hi Uno", 8888, 'xxx.xx.xx.xxx', (err) => {
      const error = false;

      clientPing.close();

      if(error == true) {
        reject('Error');
      } else {
        resolve('Pinged');
      }

    });
  });

}

А для зацикливания, если вы не должны выполнять синхронизирующий цикл, он не будет ждать до завершения setTimeout или до завершения выполнения вашей функции.

Для асинхронного зацикливанияВы можете зациклить его асинхронным ожиданием, например:

function wait () {
  return new Promise((resolve, reject)=> {
     setTimeout(() => {
       resolve()
     }, 3000)
  })
}

for (let i = 0; i<n; i++) {
   await ping();
   await wait();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...