用即时Observable拉链 [英] Zip with an immediate Observable

查看:77
本文介绍了用即时Observable拉链的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我正在使用:  observableFromEvent.Zip(GetValues()。ToObservable(),...)

with GetValues()返回一个IEnumerable。

结果是正确的但GetValues()在我订阅时完全浏览,所以在第一个事件发生之前。

我本来更喜欢Zip在引发事件时逐个使用GetValues()项的方法。


还有另一种方法吗?也许Zip不是一个好的解决方案。


感谢您的帮助!


Mitsu




Mitsu

解决方案

你需要记住,ToObservable只会在下一次订阅后立即显示所有值,在这种情况下会发生外部观察者即将订阅。  


以下内容只会在收到第一个事件后枚举您的列表。  如果您只想在收到每个事件时从更新的列表中提取单个值,那么您需要更改此信息,删除zip,将
存储到当前列表位置,以及每次收到一个事件时从列表中获取下一个项目。

 var eventStream = new Subject< string>(); 
var numberList = new List< int> {1,2,3};

var stream = Observable.Create< Tuple< string,int>>(
obs => {

var eventObs = eventStream.Publish();
var numberStream = new Subject< int>();

var eventSub = eventObs
.Take(1)
.Subscribe(e => {
foreach(varList in numberList)
numberStream.OnNext(num);
numberStream.OnCompleted();
});

var combinedSub = eventObs。 Zip(numberStream,(a,b)=> Tuple.Create(a,b))
。订阅(obs);

返回新的CompositeDisposable(eventSub,combinedSub,eventObs.Connect ());
})
。订阅(a => a.Dump());

numberList.Add(4);
eventStream.OnNext(" a");
eventStream.OnNext(" b");
eventStream.OnNext(" c");
eventStream.OnNext(" d");




Hi,

I am using:  observableFromEvent.Zip(GetValues().ToObservable(), ...)
with GetValues() returning an IEnumerable.
Results are correct but GetValues() is browsed entirely when I subscribe, so before first events are coming.
I would have prefer the Zip method to consume items from GetValues() one by one when events are raised.

Is there another way to do this ? maybe Zip is not the good solution.

Thanks for your help !

Mitsu


Mitsu

解决方案

You need to remember that ToObservable will just onNext all values immediately once subscribed, which in this case happens as soon as the outer observable is subscribed.  

Something like the following will only enumerate your list once the first event is received.  If you wanted to pull single values from your updated list only when each event is received, then you'd need to change this around, removing the zip, storing the current list position you're up to, and getting the next item from the list each time an event is received.

var eventStream = new Subject<string>();
var numberList = new List<int> { 1, 2, 3 };

var stream = Observable.Create<Tuple<string, int>>(
	obs => {
		
		var eventObs = eventStream.Publish();
		var numberStream = new Subject<int>();
		
		var eventSub = eventObs
			.Take(1)
			.Subscribe(e => {
				foreach (var num in numberList)
					numberStream.OnNext(num);
				numberStream.OnCompleted();
			});
		
		var combinedSub = eventObs.Zip(numberStream, (a, b) => Tuple.Create(a, b))
			.Subscribe(obs);
			
		return new CompositeDisposable(eventSub, combinedSub, eventObs.Connect());
	})
.Subscribe(a => a.Dump());

numberList.Add(4);
eventStream.OnNext("a");	
eventStream.OnNext("b");	
eventStream.OnNext("c");
eventStream.OnNext("d");


这篇关于用即时Observable拉链的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆