Node.js Лучше всего дождаться завершения одной и той же функции дважды - PullRequest
0 голосов
/ 06 декабря 2018

Мои 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 ]

0 голосов
/ 06 декабря 2018

Вы можете сделать это обещание:

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

Примечание: Код не проверен, данный как подсказка сверху моей головы.

0 голосов
/ 06 декабря 2018

Я думаю, что вы можете использовать обратный вызов в функции query_data, как показано ниже.Если вы хотите использовать обещание, используйте 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);
 });
}
...