在Node.js(3秒间隔)内循环永久UDP数据包ping

时间:2018-11-21 05:23:28

标签: node.js loops udp

我正在尝试建立一个服务器将运行的循环,对arduino执行ping操作,当它从IP接收到数据包时将返回数据。我已经有mongoDB集合用于处理数据了,只是停留在这一点上,我希望服务器从启动开始每隔几秒钟便开始ping 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);
  }
}

此代码旨在仅不使用promise即可运行ping的代码,但仍无法产生预期的结果。 console.log显示在上方,但似乎从未触发超时。

loop();

这仅运行两个loop()函数之一。

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

最后我以为我会尝试do,但也没有成功。

如果将所有这些顺序粘贴到文档中,它将构建我的文件。只需根据需要取消注释/注释掉每个部分。

我只是错过了明显的东西还是这里有相当复杂的东西阻止了它的工作?

谢谢!

1 个答案:

答案 0 :(得分:0)

您的ping功能写不正确。它只是在不执行回调的情况下发送ping之后才解决promise。请这样更改它。

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();
}