Я использую node-serialport для связи с частью оборудования. Он просто пишет команду и получает ответ.
https://serialport.io/docs/en/api-parsers-overview
Работает следующий код:
const port = new SerialPort(path);
const parser = port.pipe(new Readline({ delimiter: '\r', encoding: 'ascii' }));
const requestArray = [];
parser.on('data', (data) => {
// get first item in array
const request = requestArray[0];
// remove first item
requestArray.shift();
// resolve promise
request.promise.resolve(data);
});
export const getFirmwareVersion = async () => {
let resolvePromise;
let rejectPromise;
const promise = new Promise((resolve, reject) => {
resolvePromise = resolve;
rejectPromise = reject;
});
const title = 'getFirmwareVersion';
const cmd = 'V\r';
requestArray.push({
title,
cmd,
promise: {
resolve: resolvePromise,
reject: rejectPromise
}
});
await v2Port.write(cmd);
return promise;
};
Затем из моего приложения (написанного на электронном / реагирующем) я могу вызвать функцию:
<Button onClick={() => {
let data = await _api.getFirmwareVersion();
console.log('done waiting...');
console.log(data);
}>
Click Me
</Button>
Можно ли как-нибудь изменить этот код, чтобы сделать его более лаконичным?
Есть ли способ получить Обещание из функции async
, вместо того, чтобы делать новое Обещание?
Есть ли способ подключиться к уже существующему Потоку Трансформации и как-то передать Обещание туда?
Я также новичок в async / await и хотел бы избежать использования обратных вызовов, особенно в части React / Redux.
Я стремлюсь иметь много этих конечных точек для API (т.е. getFirmwareVersion
, getTemperature
и т. Д.). Поэтому я хочу сделать код максимально лаконичным. Я не хочу, чтобы пользовательский интерфейс имел какие-либо базовые знания о том, как API получает данные. Просто нужно запросить его, как и любой другой API, и дождаться ответа.