Unity3D响应式编程:Observable.WhenAll如何传入可变数量Observable?
如何在Observable.WhenAll()中使用可变数量的Observable
当然可以!Observable.WhenAll()其实提供了支持可变数量Observable的重载版本,完全能满足你处理动态URL列表的需求,不用局限于固定数量的参数传入。
实现步骤
核心思路是先把你的URL列表转换成对应的Observable集合,再将这个集合传入WhenAll():
- 将URL列表映射为Observable序列:使用LINQ的
Select方法,遍历每个URL,生成对应的ObservableWWW.Get()请求。 - 传入WhenAll():直接把这个Observable集合传给
WhenAll()即可。
完整代码示例
using System.Collections.Generic; using System.Linq; using UniRx; using UnityEngine; public class DynamicRequestsExample : MonoBehaviour { void Start() { List<string> URLs = new List<string>(); URLs.Add("http://google.com/"); URLs.Add("http://bing.com/"); // 可以根据业务需求动态添加更多URL URLs.Add("http://unity3d.com/"); // 把每个URL转换成对应的Observable网络请求 var requestObservables = URLs.Select(url => ObservableWWW.Get(url)); // 传入可变数量的Observable到WhenAll,等待所有请求完成 var parallelRequests = Observable.WhenAll(requestObservables); // 订阅请求结果 parallelRequests.Subscribe( results => { // results数组的顺序和原始URL列表的顺序完全一致 for (int i = 0; i < results.Length; i++) { Debug.Log($"URL [{URLs[i]}] 的返回结果:\n{results[i]}"); } }, error => { // 只要有一个请求失败,就会立即触发这个错误回调 Debug.LogError($"请求出错:{error.Message}"); } ); } }
额外注意事项
- 结果顺序保证:
WhenAll()返回的结果数组顺序,和你传入的Observable集合的顺序完全对应,不用担心结果和URL匹配不上。 - 容错处理:默认情况下,只要任意一个Observable触发错误,
WhenAll()会立即终止并触发错误回调。如果需要容错(比如某个请求失败不影响其他请求),可以给单个Observable添加Catch操作,示例如下:var requestObservables = URLs.Select(url => ObservableWWW.Get(url) .Catch((System.Exception ex) => { Debug.LogWarning($"URL [{url}] 请求失败:{ex.Message}"); return Observable.Return(string.Empty); // 返回默认值让整体流程继续执行 }) );
内容的提问来源于stack exchange,提问作者오명근
相关产品推荐
相关产品推荐

