RXJS - flatMap 冗余使用?

RXJS - flatMap redundant usage?

我读过关于 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);
  });

?

问题

这两个片段有什么区别?

Fiddle

第二个代码段中的代码未按预期工作,因为它创建了承诺的可观察对象(不是值)。 map 运算符不会解包承诺 return 从它。

因此,您仍然需要 flatMap 或类似的运算符来解包 promise,但您可以 return 直接在其中承诺,并简化代码如下:

var responseStream = requestStream
  .flatMap(function(requestUrl) {
    return jQuery.getJSON(requestUrl);
  });

你的问题不止一个,所以我会尽量一一回答:

  1. 您想知道它是否支持 promises,但目前支持,请参阅 the examples。问题是,只要没有记录在案,他们将来就可以取消这种支持,所以你现在可以把每个 Promise 包装成 Observable.fromPromise 或类似的东西。
  2. 内部 flatMap 很可能将 Promise 转换为 Observable 而 map 不会,这就是为什么你的代码片段不会调用任何东西:Observables 是惰性的,你需要在之后订阅每个 Observable地图函数实际上是 运行 Promise