有没有办法将两个流S1
和S2
组合成第三个S3
,它会在S2
S1
发出的第一个S1 --*----------------*------*--*--*-----------
S2 ------*--*--*----------*-----------*--*--*--
S3 ------*----------------*-----------*--------
事件后发出?
例如:
S1.sampledBy(S2).skipDuplicates()
现在我正在这样做,但它可能效率不高并且不捕获语义:
{{1}}
答案 0 :(得分:1)
假设您希望S3输出S1和S2值的某些功能,这里有一种方法:
s3 = s1.flatMapLatest(function(s1Val) {
return s2.take(1).map(function(s2Val) {
return someFunc(s1Val, s2Val);
});
});
这是一个通用的解决方案,但有两个简化:
如果您只想在S3中使用S1的值:
s3 = s1.flatMapLatest(function (s1Val) {
return s2.take(1).map(s1Val);
});
如果您只想要S2的值:
s3 = s1.flatMapLatest(s2.take(1));
这是从javascript控制台运行的复制粘贴示例测试,略微清理以忽略方法的返回值:
s1 = new Bacon.Bus();
s2 = new Bacon.Bus();
someFunc = function(a, b) { return a + b };
s3 = s1.flatMapLatest(function(s1Val) {
return s2.take(1).map(function(s2Val) {
return someFunc(s1Val, s2Val);
});
});
s3.log();
s1.push(1);
s2.push(1);
> VM5993 Bacon-from-git.js:1103 2
s2.push(2);
s2.push(3);
s1.push(2);
s1.push(3);
s2.push(7);
> VM5993 Bacon-from-git.js:1103 10