Постановка проблемы:
Рассмотрим программу js узла, работающую с экспресс-библиотекой для связи REST.
Существует несколько вызовов API REST, и все API используют один блокирующий ресурс, который может одновременно выполнять только один запрос, например последовательный порт.
У меня есть ситуация, когда я получаю несколько параллельных запросов к вызовам API, которые в некоторых случаях используют последовательный порт.
Как я могу направить вызовы API из разных методов, а затем оптимизировать их, а затем выполнить их один за другим, а затем вернуть ответ на соответствующий запрос?
Фрагмент кода:
/**
* This function is a blocking function that utilizes the serial port
*/
function request_response(shield, channel, parameter, parameterValue) {
var promise = new Promise(function (resolve, reject) {
var commandString = modbusRTURequestGenerator.modbusRTURequestGenerator(shield, channel, parameter, data, parameterValue);
serialOUT(commandString).then(() => {
Promise.race([serialIN(), timeOut()]).then(results => {
resolve(results);
});
});
});
return promise;
}
/**
* This is a GET Request API to get the parameter values.
*/
router.get("/getParameter", function (req, res) {
var shield = req.query.shield;
var channel = req.query.channel;
var parameter = req.query.parameter;
request_response(shield, channel, parameter, undefined).then(
(result) => {
res.send(result);
});
});
/**
* This is a POST Request API to set the parameter values.
*/
router.post("/setParameter", function (req, res) {
var shield = req.query.shield;
var channel = req.query.channel;
var parameter = req.query.parameter;
var parameterValue = req.body.value;
request_response(shield, channel, parameter, parameterValue).then(
(result) => {
res.send(result);
});
});
/**
* This is a GET Request API for Scan functionality.
*/
router.get("/scan", function (req, res) {
var msg = {};
var cmds_arr = [];
for (var i = 1; i <= constants.NUMBER_OF_SHIELDS; i++) {
cmds_arr.push(i + "," + constants.SCAN_COMMAND_REGISTER);
}
asyncLoop(cmds_arr, function (item, next) {
var params = item.split(",");
var shield = params[0];
var register = params[1];
request_response(shield, undefined, register, undefined).then(
(result) => {
msg[data] = result;
next();
}
});
}, function () {
res.send(msg);
});
});
Существует 3 вида HTTP REST API: scan, getParameter и setParameter. Все эти 3 обращаются к функции request_response. Поэтому, когда я запускаю API сканирования и затем параллельно запускаю API getParameter, я получаю ложные результаты.