javascript - 如何使用 RxJS 从 arrayBuffer 中拆分数据帧?

标签 javascript websocket rxjs observable rxjs5

我正在使用 websocket 从硬件接收数据帧。 数据框定义如下:

0xbb(head) ---data--- 0xee(tail)

接收到的数据存储在Uint8Array中,可能有多个帧:

var buffer = new Uint8Array([0xbb,0,0,0,0xee,0xbb,1,1,1,0xee,0xbb,3,3,3,0xee]);

我可以将数组转换为可观察的:

var obs= Rx.Observable.from(buffer);

RxMarbles:

--0xbb--0--0--0--0xee--0xbb--1--1--1--0xee--0xbb--2--2--2--0xee------
------------------000------------------111------------------222------

如何使用RxJS拆分observable? 使用哪些运营商? RxJS 是这种情况的最佳实践吗?

最佳答案

const source = Rx.Observable
  .from(['0xbb','0','0','0','0xee','0xbb','1','1','1','0xee','0xbb','3','3','3','0xee'])
  .concatMap(i => Rx.Observable.of(i).delay(1));

source
  .filter(i => i != '0xee' && i != '0xbb')
  .buffer(source.filter(i => i === '0xee'))
  .subscribe(val => console.log(val));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.2/Rx.js"></script>

我们需要使用 concatMap(.. delay(1)) 将值转换为异步,否则缓冲区的 closingNotifier 运行速度比值的摄取快最后得到三个空数组。但是由于您从 websocket 收到这些数据包,您已经是异步的。

此代码并非 100% 万无一失,例如当外部设备不发出 0xee 时会发生什么?我们最终将下一条消息连接到上一条消息。

关于javascript - 如何使用 RxJS 从 arrayBuffer 中拆分数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45203858/

相关文章:

javascript - 使 Observables 以同步和异步方式运行的方法是什么?

angular - 如果我有 combineLatest,选择 ngrx 和 rxjs 有什么不同?

javascript - javascript书签代码中 'scr' +'ipt'的串联

javascript - 为什么这是不同的月份

javascript - hdr.insertOoxml 第一次不起作用

javascript - Mutation 不会更新 VUEX 中的 store

node.js - 通过 nodejs 和 websockets 将功能从 openlayers 保存到 postgis

java - 如何取消服务器的响应?

javascript - 跨浏览器选项卡共享 websocket?

RXJS Observable - 如何从 Observable 的构造函数外部调用 next