根据https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/manyselect.md,extent
/ 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
真正做了什么,我们何时应该使用它?
谢谢@ user3743222,我找到了flatMap行为的答案:
请注意,FlatMap会合并这些Observable的发射,以便它们可以交错。
答案 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在其后发出的项目。