有没有一种方法可以在Observable.WhenAll()中指定可变数量的Observable?

时间:2019-09-09 10:01:54

标签: c# reactive-programming system.reactive reactive unirx

我正在将反应式编程应用于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);

请回复。 谢谢。

1 个答案:

答案 0 :(得分:1)

WhenAll(this IEnumerable> sources)已经做到了。我怀疑 real 问题是如何从URL列表中产生一些可观察到的东西。一种方法是使用LINQ:

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

var allAsOne= Observable.WhenAll(urlObservables);

更新

正如费利克斯·凯尔(Felix Keil)所评论的,如果OP希望仅观察其中一些可观察物,该怎么办?这是LINQ Take()的工作,应用于URL列表或可观察对象列表,例如:

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

甚至

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

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