我订阅的事件发射器中被消耗qazxsw POI的阵营原生应用。
react-native-ble-manager
我处理蓝牙事件流,其频率是每秒(赫兹)为50,100或200的事件。
我interrested在50赫兹,其中一半是在100赫兹和200赫兹其中四分之一的所有事件。什么是订阅此事件流与RxJS正确的方式和运营商应该使用抽样数据?
我可能是错的,但我似乎无法找到一个辅助方法,从事件发射器创建一个可观察的。
handleUpdateValueForCharacteristic(data) {
console.log('Received data from ' + data.peripheral + ' characteristic ' + data.characteristic, data.value);
}
bleManagerEmitter.addListener('BleManagerDidUpdateValueForCharacteristic', this.handleUpdateValueForCharacteristic );
应该是你在找什么。
它可以让你创建一个可观察的基础上自定义事件的排放(就像你这个BLE经理得到了什么)。
我提供以下概述如何使用它的一个片段。
注意fromEventPattern
和scan()
组合。通过使用以前的运营商来跟踪的第n个事件,它有效地改变在该事件是由任何用户采样,因此处理速度。
在你的情况,你会希望filter()
也跟踪发出的事件,这样你就可以最终scan()
它map()
电话后,让用户将接收到它。这里的关键是要保持filter()
内跟踪事件状态(分别在片段即蜱和事件数据的属性,scan()
和t
)为你累积的事件。
data
const { fromEventPattern } = rxjs;
const { filter, map, scan } = rxjs.operators;
// Tweak parameters to vary demo
const hz = 200;
const sample = 4;
function addEmitterHandler(handler) {
// bleManagerEmitter.addListener('event', handler)
const intervalId = setInterval(() => {
handler({ timestamp: Date.now() });
}, 1000 / hz);
return intervalId;
}
function removeEmitterHandler(handler, intervalId) {
// bleManagerEmitter.removeListener(...)
clearInterval(intervalId);
}
// Simulate emissions using the `setInterval()` call
const emitter = fromEventPattern(
addEmitterHandler,
removeEmitterHandler
);
emitter.pipe(
// Use `scan()` and `filter()` combination to adjust sampling
scan((state, data) => {
const t = (state.t % (sample + 1)) + 1;
return { t, data };
}, { t: 0, data: null }),
filter(state => state.t % sample === 0),
// Use `map()` to forward event data only
map(state => state.data),
).subscribe(data => console.log(data));