我不完全了解此运算符。
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupjoin.md
如何理解这些部分:
根据重叠的持续时间对两个序列的元素进行关联,并对结果进行分组。
leftDurationSelector(函数):一种函数,用于选择左可观察序列中每个元素的持续时间(表示为可观察序列),用于确定重叠。
rightDurationSelector(函数):用于选择右边可观察序列中每个元素的持续时间(表示为可观察序列)的函数,用于确定重叠。
从第四个参数开始:
(可观察的)可观察序列,其中右序列中的元素与左序列的元素重叠。
为什么第二和第三参数是这样的?计时器(0)对我们有什么好处?我知道0秒钟后timer(0)返回值0并完成。所以呢?
var xs = Rx.Observable.interval(100)
.map(function (x) { return 'first' + x; });
var ys = Rx.Observable.interval(100)
.map(function (x) { return 'second' + x; });
var source = xs.groupJoin(
ys,
function () { return Rx.Observable.timer(0); },
function () { return Rx.Observable.timer(0); },
function (x, yy) {
return yy.select(function (y) {
return x + y;
})
}).mergeAll().take(5);
var subscription = source.subscribe(
function (x) {
console.log('Next: ' + x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
也许您知道更好的解释来源?
最佳答案
这些是您应该查阅的资料,以更好地理解groupJoin
。出于好奇,使用此运算符的目的是什么?可能有其他方法可以做到这一点。我还没有对groupJoin
进行实用有趣的使用。
illustrated marble
unit tests(即规格,特别是第一个GroupJoinOp_Normal_I
)
examples of usage
我建议您按顺序检查这些资源(并首先了解join
),并花一些时间在大理石上以了解发生的情况。
关于官方文档示例,timer(0)
基本上为您提供一滴答的持续时间选择器。持续时间选择器仅用作信号,其值与输出无关。当持续时间选择器发出一个值或终止时,将发生填充(两个流都发出分组的值)。尽管它们不发出值也不会终止,但也会发生填充(来自两个流的值分组)。
您传递的选择器函数将接收分组的值并从中计算其他值。使用groupJoin
时,该选择器从第一个源接收值,然后将第二个源的所有相关值分组的可观察对象,就可以根据需要执行任何逻辑。