快速提问,因为我觉得我必须遗漏一些东西。 我在这里使用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
(长期连接)的结果出现错误时,都会发生以下所有情况:
event_stream
继续发生新事件,例如没有发生任何事情ui_stream
中发出以导致进一步处理这并不是一件复杂的事情,所以在分裂/扇出RX事物时,我必须误解一些基本的东西。
我想要出口这些可观察物,所以我不能再建造它们然后说'#34;嘿,这里是新事物"。我希望event_stream
和所有下游处理都不知道那里是断开连接。
ui_stream
也是如此。它刚刚获得了新的价值。
我可以使用Subject
作为生成计数器来解决问题,每当我想要重新启动所有内容时,我都会ping通,并根据network_request
将flatMap
放入share
,这样我就可以打破{{1}} ......
但这感觉就像一个真正的hacky解决方案,所以我觉得必须有一个更好的方法。
我从根本上误解了什么?
答案 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以获得更好的解释。