反应式编程:如何订阅和样本的事件发射器?

问题描述 投票:0回答:1

我订阅的事件发射器中被消耗qazxsw POI的阵营原生应用。

react-native-ble-manager

我处理蓝牙事件流,其频率是每秒(赫兹)为50,100或200的事件。

我interrested在50赫兹,其中一半是在100赫兹和200赫兹其中四分之一的所有事件。什么是订阅此事件流与RxJS正确的方式和运营商应该使用抽样数据?

我可能是错的,但我似乎无法找到一个辅助方法,从事件发射器创建一个可观察的。

javascript react-native rxjs eventemitter
1个回答
0
投票

handleUpdateValueForCharacteristic(data) { console.log('Received data from ' + data.peripheral + ' characteristic ' + data.characteristic, data.value); } bleManagerEmitter.addListener('BleManagerDidUpdateValueForCharacteristic', this.handleUpdateValueForCharacteristic ); 应该是你在找什么。

它可以让你创建一个可观察的基础上自定义事件的排放(就像你这个B​​LE经理得到了什么)。

我提供以下概述如何使用它的一个片段。

注意fromEventPatternscan()组合。通过使用以前的运营商来跟踪的第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));
© www.soinside.com 2019 - 2024. All rights reserved.