Rxjs计时器在react-native / android

时间:2018-09-27 00:35:20

标签: android typescript react-native rxjs react-native-ble-plx

好吧,为了提出我的问题,这里有一个小背景:

我有一个反应本机项目,该项目使用react-native-ble-plx库来访问设备的蓝牙。该库有一个startDeviceScan方法,该方法接受回调,因此我想使用rxjs来扫描一段时间的设备,然后将它们全部收集到一个数组中,并返回结果一个承诺。我通过bufferTimetake管道运算符的组合来做到这一点,尽管我也设法通过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 Scheduler和其他任何东西进行任何更改。也许有什么可以解决的?

我们将不胜感激。

0 个答案:

没有答案