javascript - 为什么我们需要使用 flatMap?

标签 javascript rxjs

我开始使用 RxJS,我不明白为什么在这个例子中我们需要使用像 flatMapconcatAll 这样的函数;这里的数组数组在哪里?

var requestStream = Rx.Observable.just('https://api.github.com/users');

var responseMetastream = requestStream
  .flatMap(function(requestUrl) {
    return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
  });

responseMetastream.subscribe(url => {console.log(url)})

如果有人能直观地解释发生了什么,那将非常有帮助。

最佳答案

['a','b','c'].flatMap(function(e) {
    return [e, e+ 'x', e+ 'y',  e+ 'z'  ];
});
//['a', 'ax', 'ay', 'az', 'b', 'bx', 'by', 'bz', 'c', 'cx', 'cy', 'cz']


['a','b','c'].map(function(e) {
    return [e, e+ 'x', e+ 'y',  e+ 'z'  ];
});
//[Array[4], Array[4], Array[4]]

当你有一个结果是更多 Observable 的 Observable 时,你可以使用 flatMap。

如果你有一个由另一个可观察对象产生的可观察对象,你不能直接过滤、减少或映射它,因为你有一个可观察对象而不是数据。如果您生成一个可观察对象,请选择 flatMap over map;那你就没事了。

与第二个片段一样,如果您正在进行异步操作,则需要使用 flatMap。

var source = Rx.Observable.interval(100).take(10).map(function(num){
    return num+1
});
source.subscribe(function(e){
    console.log(e)
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.1/Rx.min.js"></script>

var source = Rx.Observable.interval(100).take(10).flatMap(function(num){
    return Rx.Observable.timer(100).map(() => num)
});
source.subscribe(function(e){
    console.log(e)
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.1/Rx.min.js"></script>

关于javascript - 为什么我们需要使用 flatMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33471526/

相关文章:

javascript - 为什么 Firefox 在从 JavaScript 加载时会更改表单标签属性?

javascript - 如何从javascript下载文件

javascript - 使用 Meteor JS 访问 Linkedin API

node.js - 如何处理级联可观察值

angular - ngRx : differences between keys from state interface and keys from StoreModule. forRoot

javascript - ReactJS:使用对象引用作为{key}?

javascript - 如何在三个js中高效多次渲染一个网格?

Angular 2.0.1 AsyncPipe 不适用于 Rx Subject

node.js - 响应拦截器的 CatchError 函数执行多次 - Angular 6

javascript - Observable Race Condition,如何正确计时两个 Observables