培根/ FRP中的顺序条件

时间:2014-12-26 12:13:30

标签: frp bacon.js

有没有办法将两个流S1S2组合成第三个S3,它会在S2 S1发出的第一个S1 --*----------------*------*--*--*----------- S2 ------*--*--*----------*-----------*--*--*-- S3 ------*----------------*-----------*-------- 事件后发出?

例如:

S1.sampledBy(S2).skipDuplicates()

现在我正在这样做,但它可能效率不高并且不捕获语义:

{{1}}

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