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 и еще много чего, так как я не очень понимаю, как они работают. Может быть, есть что-то, чтобы выяснить?
Любая помощь будет оценена.