我读过关于RXJS的article,其中也解释了flatMap
我已经知道有什么不同以及它实际上做了什么,它将可观察到的可观察量变为单个可观察序列。 (类似于C#中的SelectMany
)
无论如何,他们使用flatMap
来获取jQuery getJson
请求:
var responseStream = requestStream
.flatMap(function(requestUrl) {
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
});
我很清楚发生了什么(我在许多地方看到了这种用法)
但它不是一个简单的:(以下代码不起作用,但我仍然想知道为什么,因为逻辑上似乎它应该工作)
var responseStream = requestStream
.map(function(requestUrl) {
return jQuery.getJSON(requestUrl);
});
问题
这两个片段有什么区别?
答案 0 :(得分:3)
第二个代码段中的代码无法正常工作,因为它会创建Observable of promises(而不是值)。 map
运算符不会解包从它返回的promise。
因此,您仍需要flatMap
或类似的运算符来解包promises,但您可以直接在其中返回promise,并简化代码如下:
var responseStream = requestStream
.flatMap(function(requestUrl) {
return jQuery.getJSON(requestUrl);
});
答案 1 :(得分:1)
这里有一个以上的问题,所以我试着回答两个问题:
Promise
包装到Observable.fromPromise
或类似的内容中。flatMap
最有可能将Promise强制转换为Observable而map
没有,这就是为什么你的代码片段不会调用任何东西:Observables是懒惰的,你需要在地图后订阅每个Observable函数以实际运行Promise