代码之家  ›  专栏  ›  技术社区  ›  David

node.js等待相同功能完成两次的最佳实践

  •  0
  • David  · 技术社区  · 6 年前

    我的post请求调用同一个函数两次,并将从该函数接收的数据发送回客户机。

    但我在如何等待两个函数调用都完成方面遇到了困难。

    我试图用承诺,但不知怎么的,它对我不起作用。

    let socket_latest_data = new net.Socket();
    let socket_optionmenu_data = new net.Socket();
    
    app.post("/query_latest_data", function (req, res) {
      let gauge_data = null;
      let option_data = null;
      let combined_data = {};
      gauge_data = query_data(socket_latest_data, "d");
      option_data = query_data(socket_optionmenu_data, "r");
      Object.assign(combined_data, JSON.parse(gauge_data), JSON.parse(option_data));
      res.end(combined_data);
    });
    
    function query_data(socket, char) {
      socket.connect(2711, '192.168.1.173', function () {
        socket.write(char);
      });
      socket.on('data', function (data) {
        socket.removeAllListeners();
        data = data.toString().replace(/[\[\]&]+|nan/g, '0').replace(/\s/g, '');
        return data;
      });
    }
    

    ** 更新 **

    解决方案是使用 Promise.all() 方法。使用它很重要 .then(function() 部分是因为否则我只会收到 [undefined, undefined]

    代码

    app.post("/query_latest_data", function (req, res) {
      let combined_data = {};
      Promise.all([query_data(socket_latest_data, "d"), query_data(socket_optionmenu_data, "r")]).then(function(data) {
        Object.assign(combined_data, JSON.parse(data[0]), JSON.parse(data[1]));
        console.log(combined_data);
        res.end(JSON.stringify(combined_data));
      });
    });
    
    function query_data(socket, char) {
      return new Promise((res, rej) => {
        socket.connect(2711, '192.168.1.173', function () {
          socket.write(char);
        });
        socket.on('data', function (data) {
          socket.removeAllListeners();
          data = data.toString().replace(/[\[\]&]+|nan/g, '0').replace(/\s/g, '');
          res(data);
        });
      })
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Aritra Chakraborty    6 年前

    你可以保证:

    function query_data(socket, char) {
        return new Promise((res, rej) => {
            socket.connect(2711, '192.168.1.173', function () {
                socket.write(char);
            });
            socket.on('data', function (data) {
                socket.removeAllListeners();
                data = data.toString().replace(/[\[\]&]+|nan/g, '0').replace(/\s/g, '');
                res(data);
            });
        })
    
    }
    
    app.post("/query_latest_data", async (req, res) {
        let combined_data = {};
        let combined_data_arr = await Promise.all([query_data(socket_latest_data, "d"), query_data(socket_optionmenu_data, "r")])
        Object.assign(combined_data, JSON.parse(combined_data_arr[0]), JSON.parse(combined_data_arr[1]));
        res.end(combined_data);
    });
    

    注: 代码没有被测试,这是我头脑中的一个提示。

        2
  •  1
  •   R.Sarkar    6 年前

    我认为您可以在下面的查询数据函数中使用回调。如果要使用Promise,请使用Async和Wait。希望这作品

    app.post("/query_latest_data", function (req, res) {
     let combined_data = {};
     query_data(socket_latest_data, "d",(gauge_data)=>{
        query_data(socket_optionmenu_data, "r",(option_data)=>{
          Object.assign(combined_data, JSON.parse(gauge_data), JSON.parse(option_data));
          res.end(combined_data);
        });
      });  
    });
    function query_data(socket, char,callBack) {
     socket.connect(2711, '192.168.1.173', function () {
     socket.write(char);  
    });
     socket.on('data', function (data) {
      socket.removeAllListeners();
      data = data.toString().replace(/[\[\]&]+|nan/g, '0').replace(/\s/g, '');
      callBack(data);
     });
    }
    
    推荐文章