我正在学习反应性编程,第一个印象是它类似于SignalR(均使用推送)。但是,后来我了解了区别以及RX如何不关心"如何"而只是"什么"。因此,我想实现使用RX和SignalR所学到的知识。我创建了一个简单的拍卖MVC Web应用程序,该应用程序使用Signalr以最新价格和剩余时间更新投标。
我试图使用RX实现的情况如下:
- 客户端单击"投标"按钮。
- Signalr Hub收到了竞标请求并向所有客户传播更新的价格。剩余时间增加了。
- signalr集线器发送更新剩余时间每个第二个。
所以我们有两个事件来源。竞标者单击"投标"按钮,并发出信号,每秒更新竞标者。
我不知道是否将最新出价价格更新客户端的客户视为可以在RX中实施的事件。是吗?
基于上述内容,我们有两个可观察力(SignalR Hub中的按钮和计时器)基于"您缺少的反应性编程简介"中的Andre Staltz教程[1]我可以可视化并理解按钮的点击。但是,我认为应该使用Observable.Interval
实现的计时器流有问题。因此,现在我将需要客户端中的RXJ来流按钮单击SignalR Hub将成为观察者的位置,与此同时,我将需要SignalR Hub中的RX.NET才能将其剩余时间事件流向连接的客户端谁将成为观察者。我查看了李·坎贝尔(Lee Campbell)的教程和他的反应性交易者,使用signalr和rx.net,但由于它的高级我没有详细研究,但我在Codeproject [2]上找到了Sacha Barber的简化版本[2],以及Jim-Wooley的答案[3 [3]
但是,我不明白如何实现观察者是观察者,反之亦然。 Signalr和Rx之间的边界是什么?订阅Observalbe.Interval
?如果是这样,RX? Signalr Hub的值是多少,而无需RX,则调用每个连接的客户端中的更新功能。由于一切都是流,我应该将所有内容都转移到rx吗?
我非常感谢您的帮助,或者如果您可以将我带到讨论这种情况的良好资源。
signalr frontend客户端API是基于回调模式,这是JavaScript中异步编程的最基本方法。您可以使用您喜欢的任何异步模式在此基础上构建,例如Promise,RXJS。有一篇文章涵盖了如何与RXJS接近的客户端交流 - https://blog.sstorie.com/integrating-angular-2-and-signalr-part-part-2/-2/
我建议先从回调模式开始,然后进行工作应用程序设置,然后慢慢挖掘RXJS的通信方式
将回调转换为rxjs非常简单,就像以下
var onMessage$ = new Subject()
var connection = $.hubConnection();
var myHub = connection.createHubProxy('myHub');
myHub.on('message', function(message) {
onMessage$.next(message)
});
onMessage$.subscribe((message)=>console.log(message))
但是,以功能性的反应方式写所有东西将需要大量的努力和时间进行练习。一旦您更加熟悉,我认为RXJS与承诺和回调相比,RXJS更加有效和有效。