RxJS中的extent / manySelect方法实际上做了什么?

时间:2016-04-20 12:49:47

标签: rxjs

根据https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/manyselect.mdextent / manySelect方法是一个comonadic转换器,其形式为Observable a -> (Observable a -> b) -> Observable b,"反转"版本selectMany / flatMat

文档中给出的示例:

var source = Rx.Observable.range(0, 3)
    .manySelect(function (ys) { return ys.first(); })
    .mergeAll();

var subscription = source.subscribe(
    function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });

// => Next: 0
// => Next: 1
// => Next: 2
// => Completed

我的理解是manySelect将每个观察到的值包装成Observable(类似于Rx.Observable.just(x)),然后将其放入选择器函数,最后将所有返回的值合并到一个新Observable

但是,如果我将ys.first()更改为ys.count()ys.last(),程序会崩溃并说Error: TypeError: innerSource.subscribe is not a function

发生了什么? manySelect真正做了什么,我们何时应该使用它?

JSBin

<德尔> 也是一个小问题: 当测试manySelect时,我发现`Rx.Observable.range(0,5).flatMap(()=&gt; [1,2,3,4])`产生如下序列:     onNext:1     onNext:2     onNext:1     onNext:3     onNext:2     onNext:1     onNext:4     onNext:3     onNext:2     onNext:1     onNext:4     onNext:3     onNext:2     onNext:1     onNext:4     onNext:3     onNext:2     onNext:4     onNext:3     onNext:4     已完成 而`Rx.Observable.interval(0).take(10).flatMap(()=&gt; [1,2,3,4])`给出具有正确序列的结果。 这是一个错误或功能吗?

谢谢@ user3743222,我找到了flatMap行为的答案:

  

请注意,FlatMap会合并这些Observable的发射,以便它们可以交错。

1 个答案:

答案 0 :(得分:0)

用于理解manySelect的两个额外资源:

  

manySelect运算符通常被描述为“comonadic bind”。如果这样可以为您解决问题,那么欢迎您。 Elsewise,   这是一个解释:

     

manySelect在内部转换源发出的每个项目   可观察到发出该项目和所有项目的Observable   随后由源Observable以相同的顺序发出。所以,   例如,它在内部转换发出的Observable   数字1,2,3分为三个Observable:一个发射1,2,3,一个发射   发出2,3,一个发射3。

     

然后manySelect将每个Observable传递给一个函数   您提供并发出的,来自Observable的排放   manySelect返回这些函数调用的返回值。

     

通过这种方式,生成的Observable发出的每个项目都是a   源Observable和所有的相应项的功能   源Observable在其后发出的项目。