我不完全了解此运算符。

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时,该选择器从第一个源接收值,然后将第二个源的所有相关值分组的可观察对象,就可以根据需要执行任何逻辑。

09-18 20:16