我的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);
});
})
}
答案 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);
});
注意:该代码未经测试,是我的头上提示。