Rxjs таймер завершает слишком рано на реагировать родной / Android

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

У меня есть реактивный проект, в котором для доступа к Bluetooth-устройству используется библиотека 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 мс слишком рано.

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

Любая помощь будет оценена.

0 ответов

Другие вопросы по тегам