【问题标题】:How do i use function if i need to define it later?如果我需要稍后定义它,我该如何使用它?
【发布时间】:2020-04-12 12:42:39
【问题描述】:

所以,我使用的是 node.js、express 和 serialport。我需要做的是让用户选择侦听的串行端口,使用 AJAX 请求对其进行初始化,并希望从串行端口获取一些数据。 但我实际上无法在代码中间的某个位置初始化 SerialPort 对象,因为它开始下雨并出现“未定义”错误。所以,我的代码应该是这样的:

//some definitions here...
app.post('/submitPort', (req, res) => {
    tty = new SerialPort(req.body.portpath)
})
tty.on('data', () => {...})

等等。即使我试图在代码的前面声明 tty,在 submitPort 之前,它也会抛出一堆关于它未定义的错误。 而且我理解这个逻辑 - 我之前没有初始化那个对象,所以,我该怎么做呢?但这也没有用,我的意思是,我试着这样做:

let tty = new SerialPort()
//some logic
app.post('/submitPort', (req, res) => {
     tty = new SerialPort(req.body.portpath)
})

所以,我现在迷路了。我真的需要将 web 和 serial 绑定在一起,但是,它很难粘合。我应该怎么做才能让它发挥作用?

【问题讨论】:

    标签: javascript node.js express undefined node-serialport


    【解决方案1】:

    你需要lazy initsingleton,那么这个方案就可以用了。

    const tty;
    //some definitions here...
    app.post('/submitPort', (req, res) => {
      if(!tty){
        initTTY(req.body.portpath)
      } // not define init
      res.send("DONE")
    })
    function initTTY(port) {
      tty = new SerialPort(port)
      tty.on('data', () => {
        // Do something here
      })
      tty.on('error', () => {
        tty = null; // so that can initialized
      })
    }
    

    【讨论】:

    • 这是一个想法。我没想到我们会“并行”运行代码,我们可以在其他函数中注册事件监听器,它已经被初始化了。
    【解决方案2】:

    你可以这样做。

    let tty = undefined;
    
    // Your business logic...
    
    app.post('/submit-port', (req, res) => {
       tty = new SerialPort(req.body.portpath);
       tty.on('data', () => { /*  TODO: implement the handler */ });
    });
    

    您可以将端点视为 tty 客户端的“初始化程序”。现在您可以确定您的实例在使用前已被初始化。

    【讨论】:

    • 这也不错,但标记的答案包含对 tty 的检查,并且还将其包装在函数中。但这仍然是有道理的。
    • 乐于助人。复活节快乐。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2023-03-20
    相关资源
    最近更新 更多