我不完全理解这个操作符。
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');
});
也许你知道更好的解释来源?
答案 0 :(得分:1)
以下是您应该查看的来源,以便更好地了解groupJoin
。好奇心通过使用此运算符您的目标是什么?可能有其他方法可以做同样的事情。我还没有真正有用地使用groupJoin
。
GroupJoinOp_Normal_I
)我建议您按顺序查看这些资源(首先了解join
),然后花一些时间在大理石上了解正在发生的事情。
关于官方文档示例,timer(0)
基本上为您提供了一个刻度线的持续时间选择器。持续时间选择器仅用作信号,它们的值与输出无关。当持续时间选择器发出值或终止时,会发生填充(从两个流中发出分组值)。虽然它们不会发出值也不会终止,但也会发生一些事情(从两个流中对值进行分组)。
您传递的选择器函数接收分组值并从中计算其他值。使用groupJoin
,该选择器接收来自第一个源的值,以及一个observable,它对来自第二个源的所有相关值进行分组,并且您可以使用它执行任何所需的逻辑。
答案 1 :(得分:0)
用户3743222在回答中发布后,我花了更多时间从该页面了解,我经常检查反应堆,但是对于这个功能,很难理解这些箭头从左到右有点角度。
有提到的窗户。事实证明,那些箭头代表了窗户。
第二个和第三个参数是窗口宽度:
function () { return Rx.Observable.timer(500); }
例如,上面的窗口宽度是500毫秒(假设在这种情况下我们可以测量时间单位的宽度)。
我画了一张图片,看起来更像是窗户:
因此,从我的图表中我们可以看到例如黑色窗口与绿色窗口相交,因此事件在第4个参数中通过函数连接。
与绿色和红色相同。
我没有调查其他情况,比如如果第一个流窗口中的多个事件与第二个流相交会发生什么,但至少我们知道它是如何工作的,如果有一些意外的话,也许其他人会添加信息例。
还需要进一步调查窗口宽度为0,因为从视觉上看他们不存在,我的意思是如果有一个窗口,我想它有宽度> 0