Я пытаюсь добавить тайм-аут к обещанию, взаимодействующему с последовательным портом.Эшафот для применения тайм-аута к обещанию основан на статье блога Итало Насименто (см. Функцию promiseTimeout
во фрагменте кода).
Поскольку node-serialport
делаетне предлагая интерфейс обещания Я написал небольшую оболочку для потокового интерфейса (см. функцию dummyDetectPort
), которая работает как нужно.Однако при передаче этого обещания на promiseTimeout
, чтобы включить тайм-аут для обещания, поступающего в последовательный порт, это обещание не будет ни разрешено, ни отклонено.В связи с этим «ограничивающим» обещанием является обещание тайм-аута независимо от заданного периода ожидания ms
.
Где я не могу получить точку здесь?Почему серийное обещание работает так, как ожидается, но не решается и не отклоняется, когда участвует в гонке с обещанием timeout
?
'use strict';
const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
// https://italonascimento.github.io/applying-a-timeout-to-your-promises/
const promiseTimeout = (ms, promise) => {
// Create a promise that rejects in <ms> milliseconds
let timeout = new Promise((resolve, reject) => {
let id = setTimeout(() => {
clearTimeout(id);
reject(`Timed out in ${ms} ms.`);
}, ms)
})
// Returns a race between our timeout and the passed in promise
return Promise.race([
timeout,
promise,
])
}
const dummyDetectPort = (portName) => {
console.log(`Promise created (${portName}).`);
return new Promise( (reject, resolve) => {
const port = new SerialPort(portName);
const parser = port.pipe(new Readline());
port.write(`${portName}\n`);
parser.on('data', (data) => {
console.log(`Received data on ${portName}: ${data}`);
port.close( (err) => reject(err) );
console.log(data == portName);
if (data == portName)
{
const msg = `Promise resolved (${portName}).`;
return resolve(msg);
}
else
{
const msg = `Promise rejected (${portName}).`;
return reject(msg);
}
})
})
}
const main = (portName) => {
promiseTimeout(60000, dummyDetectPort(portName))
// dummyDetectPort(portName)
.then(result => console.log(result))
.catch(err => console.log(err))
}
main('/dev/tty.usbserial-FTG7L3FX');