RXJS - flatMap冗余使用?

时间:2017-04-14 07:25:14

标签: javascript rxjs flatmap

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

2 个答案:

答案 0 :(得分:3)

第二个代码段中的代码无法正常工作,因为它会创建Observable of promises(而不是值)。 map运算符不会解包从它返回的promise。

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

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

答案 1 :(得分:1)

这里有一个以上的问题,所以我试着回答两个问题:

  1. 您想知道它支持承诺,但目前确实如此,请参阅the examples。问题是,只要没有记录,他们将来就可以删除此支持,因此您现在可以将每个Promise包装到Observable.fromPromise或类似的内容中。
  2. 内部flatMap最有可能将Promise强制转换为Observable而map没有,这就是为什么你的代码片段不会调用任何东西:Observables是懒惰的,你需要在地图后订阅每个Observable函数以实际运行Promise