Javascript RXJS-平面图冗余使用?

Javascript RXJS-平面图冗余使用?,javascript,rxjs,flatmap,Javascript,Rxjs,Flatmap,我读过一篇关于RXJS的文章,其中还介绍了flatMap 我已经知道了它们之间的区别,以及它们的实际作用,它将可观察到的事物展平为一个单一的可观察序列。(类似于C#中的SelectMany) 无论如何,他们使用了flatMap作为jQuerygetJson请求: var responseStream = requestStream .flatMap(function(requestUrl) { return Rx.Observable.fromPromise(jQuery.getJS

我读过一篇关于RXJS的文章,其中还介绍了
flatMap

我已经知道了它们之间的区别,以及它们的实际作用,它将可观察到的事物展平为一个单一的可观察序列。(类似于C#中的
SelectMany

无论如何,他们使用了
flatMap
作为jQuery
getJson
请求:

var responseStream = requestStream
  .flatMap(function(requestUrl) {
    return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
  });
我很清楚发生了什么(我在很多地方都看到这种用法)

但这难道不是一个简单的问题吗:(下面的代码不起作用,但我还是想知道为什么,因为从逻辑上看,它应该起作用)

?

问题

这两个片段之间有什么区别


第二个代码段中的代码未按预期工作,因为它创建了可观察的承诺(而不是值)<代码>映射操作员将不会取消从其返回的承诺

因此,您仍然需要
flatMap
或类似的操作符来展开承诺,但您可以在其中直接返回承诺,并将代码简化如下:

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

这里有不止一个问题,所以我会尝试回答这两个问题:

  • 你想知道它是否支持承诺,但目前确实如此,请参见。问题是,只要没有文档记录,他们将来就可以删除此支持,因此您可以立即将每个
    Promise
    包装成
    Observable.fromPromise
    或类似内容
  • 在内部,
    flatMap
    很可能会将Promise强制转换为Observable,而
    map
    则不会,这就是为什么您的代码片段不会调用任何东西:Observable是惰性的,您需要在map函数之后订阅每个Observable,以便实际运行Promise

  • flatMap为什么知道展开承诺,它应该在哪里展开观测值?它也支持承诺,除此之外,您可以从它返回数组,它还将展平它。不确定rxjs5指向哪里,但rxjs4指向哪里:
    var responseStream = requestStream
      .flatMap(function(requestUrl) {
        return jQuery.getJSON(requestUrl);
      });