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