System.reactive ,将source更改为以下内容可以让您更接近(我想,我还是不确定):
这将产生以下输出:System.reactive ,将source更改为以下内容可以让您更接近(我想,我还是不确定):,system.reactive,rxjs5,System.reactive,Rxjs5,这将产生以下输出: Next: source 1: 0 Next: source 1: 1 Next: source 2: 1 Next: source 3: 1 Next: source 4: 1 Next: source 5: 1 Next: source 5: 2 Next: source 5: 3 Next: source 5: 4 Next: source 5: 5 Next: source 5: 6 Next: source 5: 7 Next: source 5: 8 Next:
Next: source 1: 0
Next: source 1: 1
Next: source 2: 1
Next: source 3: 1
Next: source 4: 1
Next: source 5: 1
Next: source 5: 2
Next: source 5: 3
Next: source 5: 4
Next: source 5: 5
Next: source 5: 6
Next: source 5: 7
Next: source 5: 8
Next: source 5: 9
Completed
这对我来说很有意义。如果您可以发布所需的输出,我将帮助您实现。我强烈建议您发布所需的输出。你想要什么还不清楚。对于C#示例,将源代码更改为以下代码可以让您更接近(我想,我还是不确定): 这将产生以下输出:
Next: source 1: 0
Next: source 1: 1
Next: source 2: 1
Next: source 3: 1
Next: source 4: 1
Next: source 5: 1
Next: source 5: 2
Next: source 5: 3
Next: source 5: 4
Next: source 5: 5
Next: source 5: 6
Next: source 5: 7
Next: source 5: 8
Next: source 5: 9
Completed
这对我来说很有意义。如果您可以发布所需的输出,我将帮助您达到目标。您希望看到什么?我希望看到每个源的2个值,因为每个源在开始发射时都有另一个时间点。发现此:开关不是选项:“请注意,当源可观测对象发出新的可观测对象时,它将取消订阅先前发出的可观测对象,而不是当新的可观测对象发出项目时。“你希望看到什么?我希望看到来自每个源的2个值,因为每个源在开始发射时都有另一个时间点。发现:开关不是一个选项:”注意,当源可观测发射新的可观测时,它将取消订阅先前发射的可观测,而不是当新的可观测发射项目时。“IIUC这个人在使用之前我必须调用
source.connect()
,对吗?@MarkusW.No,在.Publish(选择器):IObservable
和.Publish():IConnectableObservable
。这个答案是使用Rx.netsyntrax而不是RxJs.IIUC这个人,我必须调用source.connect())
在使用之前,对吗?@MarkusW.No,在.Publish(选择器):IObservable
和.Publish()之间有区别:IConnectableObservable
。此外,这个答案是使用Rx.Net syntrax而不是RxJs。虽然我将此标记为解决方案,但在类型不安全的JavaScript中仅此而已。在RxJs 5.0.0-beta.10中,发布的签名已更改,因此您无法再平面映射序列,因为类型不得更改:导出函数发布(选择器?:(来源:可观察)=>可观察):可观察|可连接可观察{
.Ouch.@MarkusW.Ouch,我正在填补一个问题。@MarkusW.另外,如果源代码
是冷的,但内部观察值是热的,这个解决方案效果最好。它也可以处理冷的,但最终会订阅多次。如果它们不热,你可以添加源代码.map(src=>src.share()).publish(src=>src
到第一行。但我知道它们在实践中对您来说已经很热门了。虽然我将此标记为解决方案,但在类型不安全的JavaScript中,它只是这样。在rxjs 5.0.0-beta.10中,publish的签名已更改,因此您无法再平面映射序列,因为类型不得更改:export function publish(选择器?:(来源:Observable)=>Observable):Observable | ConnectableObservable{
.Ouch.@MarkusW.Ouch,我正在填补一个问题。@MarkusW.另外,如果源代码
是冷的,但内部观察值是热的,这个解决方案效果最好。它也可以处理冷的,但最终会订阅多次。如果它们不热,你可以添加源代码.map(src=>src.share()).publish(src=>src
到第一行。但我知道它们在实践中对你来说已经很热门了。
Next: source 5: 0
Next: source 5: 1
Next: source 5: 2
Next: source 5: 3
Next: source 5: 4
Next: source 5: 5
Next: source 5: 6
Next: source 5: 7
Next: source 5: 8
Next: source 5: 9
Completed
let originalSequence = Observable.timer(0, 1000).take(10).share();
let empty = Observable.empty();
let source = Observable.range(1, 5)
.map(i =>
originalSequence.delay(i * 2000).map(x => "source " + i + ": " + x))
.reduce((s1, s2) => s1.takeUntil(s2).concat(s2), empty)
.mergeAll();
let empty = Observable.empty();
let source = Observable.range(1, 5)
.map(i =>
Observable.timer(i * 2000, 1000).map(x => "source " + i + ": " + x).take(10).share())
.reduce((s1, s2) => s1.takeUntil(s2).concat(s2), empty)
.mergeAll();
using System;
using System.Linq;
using System.Reactive.Linq;
using System.Threading;
namespace RxScanProblem
{
class Program
{
static void Main(string[] args)
{
var originalSequence = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Take(10).Select(i => (long)i).Publish();
var empty = Observable.Empty<string>();
var source = Observable.Range(1, 5)
.Select(i => originalSequence.Delay(TimeSpan.FromSeconds(2 * i)).Select(x => "source " + i + ": " + x))
.Aggregate(empty, (s1, s2) => s1.TakeUntil(s2).Concat(s2))
.SelectMany(x => x);
source.Subscribe(
s => Console.WriteLine("Next: " + s),
ex => Console.WriteLine("Error: " + ex.Message),
() => Console.WriteLine("Completed"));
originalSequence.Connect();
// Dirty, I know
Thread.Sleep(20000);
}
}
}
Next: source 1: 0
Next: source 1: 1
Next: source 1: 2
let empty = Observable.empty();
let source = Observable.range(1, 5)
.map(i => Observable.timer(i * 2000, 1000).map(x => "source " + i + ": " + x).take(10))
.switch();
Next: source 5: 0
Next: source 5: 1
Next: source 5: 2
Next: source 5: 3
Next: source 5: 4
Next: source 5: 5
Next: source 5: 6
Next: source 5: 7
Next: source 5: 8
Next: source 5: 9
var originalSequence = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Take(10).Select(i => (long)i).Publish();
var empty = Observable.Empty<string>();
var source = Observable.Range(1, 5)
.Select(i => originalSequence.Delay(TimeSpan.FromSeconds(2 * i)).Select(x => "source " + i + ": " + x))
.Switch();
let source = Observable.range(1, 5)
.map(i =>
Observable.timer(i * 2000, 1000).map(x => "source " + i + ": " + x).take(10))
.reduce((s1, s2) => s1.takeUntil(s2).concat(s2), empty)
.mergeAll();
s1 = Observable.timer(1 * 2000, 1000).map(x => "source 1: " + x).take(10));
s2 = Observable.timer(2 * 2000, 1000).map(x => "source 2: " + x).take(10));
s3 = Observable.timer(3 * 2000, 1000).map(x => "source 3: " + x).take(10));
s4 = Observable.timer(4 * 2000, 1000).map(x => "source 4: " + x).take(10));
s5 = Observable.timer(5 * 2000, 1000).map(x => "source 5: " + x).take(10));
s1.takeUntil(s2).concat(s2)
.takeUntil(s3).concat(s3)
.takeUntil(s4).concat(s4)
.takeUntil(s5).concat(s5)
s1 --0123456789
s2 ----0123456789
s3 ------0123456789
s4 --------0123456789
s5 ----------0123456789
s1.takeUntil(s2) --01|
.concat(s2) --01----0123456789
takeUntil(s3) --01--|
.concat(s3) --01--------0123456789
takeUntil(s4) --01----|
.concat(s4) --01------------0123456789
takeUntil(s5) --01------|
.concat(s5) --01----------------0123456789
source.publish(src => src
.flatMap(inner1 =>
inner1.takeUntil(src.flatMap(inner2 => inner2.take(1)))
))
var source = Observable.Range(1, 5)
.Select(i => originalSequence
.Delay(TimeSpan.FromSeconds(2 * i))
.Select(x => "source " + i + ": " + x)
)
//making sure s2 is shared properly, thus concated properly
.Aggregate(empty, (s1, s2) => s2.Publish( _s2 => s1
.TakeUntil(_s2)
.Concat(_s2)
))
.SelectMany(x => x);
Next: source 1: 0
Next: source 1: 1
Next: source 2: 1
Next: source 3: 1
Next: source 4: 1
Next: source 5: 1
Next: source 5: 2
Next: source 5: 3
Next: source 5: 4
Next: source 5: 5
Next: source 5: 6
Next: source 5: 7
Next: source 5: 8
Next: source 5: 9
Completed