Javascript 如何用RxJS编写简单的元流 背景

Javascript 如何用RxJS编写简单的元流 背景,javascript,node.js,stream,rxjs,observable,Javascript,Node.js,Stream,Rxjs,Observable,这是我第一次尝试反应式编程。 我有一个随时接收数据缓冲区的流 当缓冲区以02开始时,表示消息的开始;当缓冲区以03结束时,表示消息的结束 例如: - - - 02 53 44 5a - - - 52 6a 72 7a - - - 62 32 62 0d - 0a 03 - - - - > 客观的 我的目标是在每次检测到消息完成时触发一个事件,并将整个消息作为参数 研究 在读了几本书之后,我知道我想创造一个新的世界 通过我的研究,我相信我想要创建一个“元可观察”或“元流”,即,一个可观察

这是我第一次尝试反应式编程。 我有一个随时接收数据缓冲区的流

当缓冲区以
02
开始时,表示消息的开始;当缓冲区以
03
结束时,表示消息的结束

例如:

- - - 02 53 44 5a - - - 52 6a 72 7a - - - 62 32 62 0d - 0a 03 - - - - > 
客观的 我的目标是在每次检测到消息完成时触发一个事件,并将整个消息作为参数

研究 在读了几本书之后,我知道我想创造一个新的世界

通过我的研究,我相信我想要创建一个“元可观察”或“元流”,即,一个可观察的或流的流(尽管这可能令人困惑…)

我的计划如下:

- 05 34 43 31 - - - 12 23 43 - - 02 53 44 5a - - - 52 6a 72 7a - - - 62 32 62 0d - 0a 03 - - - - > 
                             - - 02 53 44 5a - - - 52 6a 72 7a - - - 62 32 62 0d - 0a 03 - - | 
1-为传入的所有缓冲区消息创建一个可观察的 2-订阅步骤1,并创建一个可观察对象,用于检测消息的开头(
02
)和结尾(
03
) 3-订阅第2步中的内容,以处理数据

因此,我的图表如下所示:

- 05 34 43 31 - - - 12 23 43 - - 02 53 44 5a - - - 52 6a 72 7a - - - 62 32 62 0d - 0a 03 - - - - > 
                             - - 02 53 44 5a - - - 52 6a 72 7a - - - 62 32 62 0d - 0a 03 - - | 
问题 1-由于我通过node.js中的套接字接收此数据:

socket = net.createConnection( { host: "localhost", port: 8080}, () => {
    socket.on( "data", console.log );
} );
我认为我不能使用rxjs提供的桥接器。我必须使用观测者。创建,对吗


2-即使我解决了问题1,我也不知道如何创建一个流来实现这个效果。有人能举一个代码片段作为例子吗?

你的思路是对的。但是,您希望创建一个可观察对象,因此您可能希望
可观察。创建
而不是
观察者。创建
。它非常混乱,因为
可观察。create
需要一个包含
观察者的函数。然后,该函数可以将项目发送到该
观察者

你也渴望认识到你想要一个热的可观察的。然而,
Observable.create
无论如何都会给你一个热的可观察性。您仍然希望使用某种发布来避免多个订阅。我们将通过
共享
来实现这一点。至于缓冲,您可能可以使用
buffer
。最后我想会是这样的

  • A-使用
    observable创建的observable。围绕套接字回调创建
  • B-用
  • C-flatMapB从缓冲区流转到项目流
  • D-观看C,并仅用于在
    03
    上发射
  • E-C使用D作为结束选择器
然后将E公开为服务的公共APIE将在消息到达时发出整个消息

*注意,此方法假设您连续收到消息,因此我们不需要处理
02
信号,因为我们知道消息结束后的第一个字节必须是下一条消息的开始。如果不是这样的话,你会希望处理得更好

**您可以在
flatMap
之后共享。这将稍微更有效。您不能在缓冲区后共享

***在重读你的问题时,我注意到你想要的是一个流,而不是数组流。要获得此结果,您可以获取
缓冲区的输出
,并使用
observatable在
flatMap
中运行它。这将为您提供冷流的热流