首页 > 解决方案 > 有没有办法在 Observable.WhenAll() 中指定可变数量的 Observable?

问题描述

我正在将反应式编程应用于 Unity3D 项目。有没有办法在 Observable.WhenAll() 中指定可变数量的 Observable?

样本或搜索结果建议以明确的方式输入所有非可变项目,其中大部分不是可变数字。

var parallel = Observable.WhenAll(
                    ObservableWWW.Get ("http://google.com/"),
                    ObservableWWW.Get ("http://bing.com/"),
                    ObservableWWW.Get ("http://unity3d.com/");

我想要的是如下。

List<string> URLs = new List<string>();
URLs.Add("http://google.com/");
URLs.Add("http://bing.com/");
...
...
var parallel = Observable.WhenAll( ??? //ObservableWWW.Get() : count of URLs list);

请回复。谢谢你。

标签: c#reactive-programmingsystem.reactivereactiveunirx

解决方案


WhenAll(this IEnumerable> sources)已经这样做了。我怀疑真正的问题是如何从 URL 列表中生成一些 observables。一种方法是使用 LINQ :

var urlObservables=URLs.Select(url=>ObservableWWW.Get(url));

var allAsOne= Observable.WhenAll(urlObservables);

更新

正如 Felix Keil 评论的那样,如果 OP 只想观察其中的几个可观察对象怎么办?这是 LINQ 的Take()的工作,应用于 URL 列表或 observables 列表,例如:

var someObservables=URLs.Take(2).Select(url=>ObservableWWW.Get(url));

甚至

var someObservables=URLs.Select(url=>ObservableWWW.Get(url)).Take(2);

LINQ 的惰性求值意味着运算符仅在someObservables被枚举时才会运行。发生这种情况时,枚举将在前两次迭代后停止,因此ObservableWWW.Get只会被调用两次


推荐阅读