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

时间:2018-12-06 10:50:29

标签: node.js express asynchronous callback promise

我的POST请求两次调用相同的函数,然后将从该函数接收的数据发送回客户端。

但是我在努力等待两个函数调用完成。

我尝试使用Promises,但是由于某种原因它对我不起作用。

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 个答案:

答案 0 :(得分:1)

我认为您可以在query_data函数中使用回调,如下所示。如果要使用Promise,请使用async和await。希望这行得通

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

答案 1 :(得分:1)

您可以保证:

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

注意:该代码未经测试,是我的头上提示。