如何基于第一个对两个流进行分组和组合?

时间:2016-09-20 03:19:19

标签: javascript reactive-programming rxjs reactive-cocoa

我想根据第一个的值对两个流进行分组和组合。举一个具体的例子说明,

Marbles

每当第一个流发生变化时,我想将值与第二个流组合,但跳过下一个值(即图中的值1,3和6)。

我在iOS上使用ReactiveCocoa,但欢迎使用其他反应框架的示例。

2 个答案:

答案 0 :(得分:2)

在javascript中,它会像(未经过测试):

const result$ = a$.flatMapLatest(a => b.skip(1).map(b => {a,b}))

这应该是做什么的:

  • 为每个传入a,听取bs,跳过第一个b,并将b和a放在一起

你有限制:

  • b必须是热流

顺便提一下好的图。

答案 1 :(得分:1)

我目前在ReactiveCocoa中的实现:

var cook = MutableProperty("")
var ingredient = MutableProperty("")

cook.signal.observeNext { cook in
    print(">", cook)
}

let skipFirst = cook.signal
    .flatMap(.latest) { cookValue in
        return ingredient.signal
            .map { ingredientValue in
                "\(cookValue) \(ingredientValue)"
            }
            .skip(first: 1)
    }

skipFirst.observeNext { str in
    print(">>", str)
}

// Send values

cook.value = "grill"
ingredient.value = "asparagus"
ingredient.value = "beef"

cook.value = "fry"
ingredient.value = "ice cream"
ingredient.value = "donut"
ingredient.value = "shoe"

cook.value = "steam"
ingredient.value = "egg"
ingredient.value = "lettuce"

打印:

> grill
>> grill beef
> fry
>> fry donut
>> fry shoe
> steam
>> steam lettuce

但这意味着如果我还想使用每个组的第一个值,我必须重复flatMap转换,这看起来并不是很干。

cook.signal
    .flatMap(.latest) { cookValue in
        return ingredient.signal
            .map { ingredientValue in
                "\(cookValue) \(ingredientValue)"
            }
            .take(first: 1)
    }
    .observeNext { str in
        print("**>", str)
    }