Rxjs таймер завершает слишком рано на реагировать родной / Android - PullRequest
0 голосов
/ 27 сентября 2018

Хорошо, чтобы задать мой вопрос, вот небольшой контекст:

У меня есть реактивный проект, который использует библиотеку act-native-ble-plx для доступаблютус устройства.В библиотеке есть метод startDeviceScan, который принимает обратный вызов, и поэтому я хотел использовать rxjs для сканирования устройств в течение определенного периода времени, а затем собирать их все в массив, возвращая результат в качестве обещания.Я делаю это с помощью комбинации bufferTime и take операторов канала, хотя мне удалось сделать это и с takeUntil(timer()).Это код для сканирования (примечание: я также использую машинопись):

  async lookForNearbyDevices(timeout = 5000): Promise<Device[]> {
    if (timeout < 1) {
      throw new Error('Erro: lookForNearbyDevices requer um timeout')
    }

    return new Promise<Device[]>((resolve, reject) => {
      const scanReader = new Observable<Device>(obs => {
        this.manager.startDeviceScan(
          [ServiceUUIDs],
          { allowDuplicates: false },
          (err, dvc) => {
            if (err) {
              obs.error(err)
              return
            } else if (!dvc) {
              // Unreachable code
              return
            }

            if (!protocolNameMatches(dvc.name)) {
              // not what I'm looking for
              return
            }

            obs.next(dvc)
          },
        )
      }).pipe(
        distinct(dvc => dvc.id),
        bufferTime(timeout),
        take(1),
      )

      let dvcs: Device[] = []
      scanReader.subscribe({
        next: result => (dvcs = result),
        error: err => {
          console.debug(err)
          reject(err)
        },
        complete: () => {
          this.manager.stopDeviceScan()
          resolve(dvcs)
        },
      })
    })
  }

Проблема в том, что при выполнении его на моем устройстве (Android 8.0), bufferTime (и даже timer) излучает ~ 2900 мс слишком рано, независимо от значения timeout.Это проблема, потому что я не хочу заканчивать сканирование слишком рано;Прямо сейчас я могу «справиться» с этим, добавив 3 к тайм-ауту, но я скорее выясню основную проблему, чем полагаться на этот тип пэчворка.

Пытаясь выяснить это, я решилпопробуйте минималистский пример:

const obs = timer(6000)
console.time('timerRXJS')
obs.subscribe({
  complete() {
    console.timeEnd('timerRXJS')
  },
})

... и этот пример также завершает работу на 2900 мс слишком рано.

Есть ли какая-либо причина, по которой bufferTimetimer) будет излучаться раньшекак это?Обратите внимание, что я ничего не изменил в планировщиках rxjs и еще много чего, так как я не очень понимаю, как они работают.Может быть, есть что-то, что нужно выяснить?

Любая помощь будет приветствоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...