【问题标题】:RXJS - flatMap redundant usage?RXJS - flatMap 冗余使用?
【发布时间】:2017-09-10 10:51:29
【问题描述】:

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

?

问题

这两个 sn-ps 有什么区别?

Fiddle

【问题讨论】:

    标签: javascript rxjs flatmap


    【解决方案1】:

    第二个 sn-p 中的代码没有按您预期的那样工作,因为它创建了承诺的 Observable(不是值)。 map 操作员不会解开从它返回的承诺。

    所以,你仍然需要flatMap或类似的操作符来解包promise,但你可以直接在其中返回promise,并简化代码如下:

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      相关资源
      最近更新 更多