了解groupJoin

时间:2016-04-17 16:19:47

标签: javascript rxjs

我不完全理解这个操作符。

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupjoin.md

如何理解这些部分:

  

根据重叠持续时间关联两个序列的元素,并对结果进行分组。

     

leftDurationSelector(Function):用于选择左可观察序列的每个元素的持续时间(表示为可观察序列)的函数,用于确定重叠。   rightDurationSelector(Function):一个函数,用于选择正确可观察序列的每个元素的持续时间(表示为可观察序列),用于确定重叠。

从第四个论点开始:

  

(Observable)一个可观察序列,其中右序列中的元素与左序列元素重叠。

为什么这里的第二和第三个参数是这样的?计时器(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');
    });

也许你知道更好的解释来源?

2 个答案:

答案 0 :(得分:1)

以下是您应该查看的来源,以便更好地了解groupJoin。好奇心通过使用此运算符您的目标是什么?可能有其他方法可以做同样的事情。我还没有真正有用地使用groupJoin

我建议您按顺序查看这些资源(首先了解join),然后花一些时间在大理石上了解正在发生的事情。

关于官方文档示例,timer(0)基本上为您提供了一个刻度线的持续时间选择器。持续时间选择器仅用作信号,它们的值与输出无关。当持续时间选择器发出值或终止时,会发生填充(从两个流中发出分组值)。虽然它们不会发出值也不会终止,但也会发生一些事情(从两个流中对值进行分组)。

您传递的选择器函数接收分组值并从中计算其他值。使用groupJoin,该选择器接收来自第一个源的值,以及一个observable,它对来自第二个源的所有相关值进行分组,并且您可以使用它执行任何所需的逻辑。

答案 1 :(得分:0)

用户3743222在回答中发布后,我花了更多时间从该页面了解,我经常检查反应堆,但是对于这个功能,很难理解这些箭头从左到右有点角度。

有提到的窗户。事实证明,那些箭头代表了窗户。

第二个和第三个参数是窗口宽度:

 function () { return Rx.Observable.timer(500); }

例如,上面的窗口宽度是500毫秒(假设在这种情况下我们可以测量时间单位的宽度)。

我画了一张图片,看起来更像是窗户:

enter image description here

因此,从我的图表中我们可以看到例如黑色窗口与绿色窗口相交,因此事件在第4个参数中通过函数连接。

与绿色和红色相同。

我没有调查其他情况,比如如果第一个流窗口中的多个事件与第二个流相交会发生什么,但至少我们知道它是如何工作的,如果有一些意外的话,也许其他人会添加信息例。

还需要进一步调查窗口宽度为0,因为从视觉上看他们不存在,我的意思是如果有一个窗口,我想它有宽度> 0