Тайм-аут для обещания не разрешает и не отклоняет завернутое обещание - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь добавить тайм-аут к обещанию, взаимодействующему с последовательным портом.Эшафот для применения тайм-аута к обещанию основан на статье блога Итало Насименто (см. Функцию 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...