好吧,为了提出我的问题,这里有一个小背景:
我有一个反应本机项目,该项目使用react-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 Scheduler和其他任何东西进行任何更改。也许有什么可以解决的?
我们将不胜感激。