ReactiveX重试多个消费者

时间:2016-05-11 13:07:46

标签: system.reactive rxjs reactivex

快速提问,因为我觉得我必须遗漏一些东西。 我在这里使用rxjs是因为它是我所面对的,这是一个普遍的反应性问题,我相信。

让我们说我有一组像这样的Observable:

network_request = some_thing // An observable that produces the result of a network call
event_stream = network_request.flatMapLatest(function(v) {
    return connectToThing(v) // This is another observable that needs v
}) // This uses the result of the network call to form a long-term event-based connection

所以,这很好用。 但问题是。 有时连接失败了。

所以,如果我做event_stream.retry()它很有效。当它失败时,它会重新启动网络呼叫,并获得一个新的v用于建立新连接。

问题

如果我想要从我的network_request链接两件事,会发生什么? 也许我希望UI在每次网络调用完成时都做一些事情,比如在UI中显示一些关于v的信息?

我能做到:

shared = network_request.share() // Other implementations call this refCount
event_stream = shared.flatMapLatest(...) // same as above
ui_stream = shared.flatMapLatest(...) // Other transformation on network response

如果我没有share,那么它会发出两个请求,这不是我想要的,但是share,当event_stream之后有一个错误,它没有重试网络请求,因为引用计数仍然是1(由于ui_stream),所以它立即返回完成。

我想要什么

这显然是我为解释我的困惑而做出的一个小例子。 我想要的是,每次event_stream(长期连接)的结果出现错误时,都会发生以下所有情况:

  1. 再次发出网络请求
  2. 该请求的新响应用于构建新连接,event_stream继续发生新事件,例如没有发生任何事情
  3. 同样的响应也会在ui_stream中发出以导致进一步处理
  4. 这并不是一件复杂的事情,所以在分裂/扇出RX事物时,我必须误解一些基本的东西。

    解决方法我认为我可以做但想避免

    我想要出口这些可观察物,所以我不能再建造它们然后说'#34;嘿,这里是新事物"。我希望event_stream和所有下游处理都不知道那里是断开连接。 ui_stream也是如此。它刚刚获得了新的价值。

    我可以使用Subject作为生成计数器来解决问题,每当我想要重新启动所有内容时,我都会ping通,并根据network_requestflatMap放入share,这样我就可以打破{{1}} ...... 但这感觉就像一个真正的hacky解决方案,所以我觉得必须有一个更好的方法。

    我从根本上误解了什么?

2 个答案:

答案 0 :(得分:0)

正如我一直在考虑的那样,我已经和ionoy达到同样的目的,即retry只是断开连接并重新连接,而上游并不知道它是由于错误。

当我想到我想要的东西时,我意识到我真的想要一个像连锁店和观众一样的东西,所以我现在已经有了这个:

network_request = some_thing
network_shadow = new Rx.Subject()

event_stream = network_request.do(network_shadow).flatMapLatest(...)
ui_stream = network_shadow.whatever

这具有在event_stream或下游重试将导致整个事情重新启动的属性,而ui_stream是它自己的事情。 由于network_shadow实际上并不是event_stream的订阅者,因此那里的任何错误都无法执行任何操作,但只要主事件链正在运行,它就会删除这些值。

我觉得这不是理想的,但它比我所关注的更好,我需要做的是restartEverything.onNext() doOnError,这本来是毛。

我现在正在使用它,我们会看到它咬我的地方......

答案 1 :(得分:0)

您需要使用 window.onload = function() { $(".navbar ul li a").fadeOut(200); $(".navbar").slideUp("medium"); }; $(".navbar ul li a").mouseenter(function() { $(".navbar ul li a").fadeTo(200, 1);//This will set all a tags in vew }); $(".navbar ul li a").mouseleave(function() { $(".navbar ul li a").fadeTo(100, 0.8); //This will set all a tags in view }); $(document).ready(function() { $("#wrap").mouseenter(function() { $(".navbar ul li a").fadeIn(100); $(".navbar").stop().slideDown("fast"); }); $("#wrap").mouseleave(function() { $(".navbar ul li a").fadeOut(200); $(".navbar").slideUp("medium"); }); }); 让您感受到寒冷。请阅读http://www.introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html#HotAndCold以获得更好的解释。