gpt4 book ai didi

javascript - 有办法创建这个流序列吗?

转载 作者:行者123 更新时间:2023-12-03 07:22:50 24 4
gpt4 key购买 nike

我正在尝试实现这个弹珠图,其假设是有 N 个 sN$,并且我将此流添加到 main$ 中。

s1$    +--1--------------------99--------------------->
s2$ +------3--------7------------------------------>

main$ +---[1]-[1, 3]---[1, 7]---[99, 7]-------------->

现在我有一个近似值,但是有“重复”

const main$ = new Rx.Subject()
const s1$ = new Rx.Subject()
const s2$ = new Rx.Subject()

main$
.scan((a, c) => [...a, c], [])
.subscribe(v => console.log(v))

s1$.subscribe(x => main$.onNext(x))
s2$.subscribe(x => main$.onNext(x))

s1$.onNext(3)
s2$.onNext(1)

s1$.onNext(6)
s2$.onNext(44)

/*
Expect:
[3]
[3, 1]
[6, 1]
[6, 44]
*/

/*
What I have:
[3]
[3, 1]
[3, 1, 6]
[3, 1, 6, 44]
*/

有办法做到这一点吗?我还尝试将流 sN$ 添加到 main$ 中:

const main$ = new Rx.Subject()
const s1$ = new Rx.Subject()
const s2$ = new Rx.Subject()

main$
.mergeAll()
.scan((a, c) => [...a, c], [])
.subscribe(
(v) => console.log(v)
)

main$.onNext(s1$)
main$.onNext(s2$)

s1$.onNext(3)
s2$.onNext(1)

s1$.onNext(6)
s2$.onNext(44)

最佳答案

您可以使用combineLatest 。虽然这仍然要求每个流都以一个值开头,但您可以使用 null 值作为前缀,使每个流都以使用 startWith 的内容开头。 .

const source = Rx.Observable.combineLatest(
s1.startWith(void 0),
s2.startWith(void 0),
s3.startWith(void 0),
(s1, s2, s3) => [s1, s2, s3])

您可以选择从结果数组中删除未定义值。

现在,我们可以扩展它以处理可变的流列表。感谢@xgrommx。

main$
.scan((a, c) => a.concat(c), [])
.switch(obs => Rx.Observable.combineLatest(obs))

我们还可以使用c.shareReplay(1)让流在切换时记住最后一个值。然而,这不会与 c.startWith(void 0) 结合使用,因此我们可以使用其中之一。

示例:

    const main$ = new Rx.Subject()
const s1$ = new Rx.Subject(1)
const s2$ = new Rx.Subject(1)
const s3$ = new Rx.Subject(1)
const s4$ = new Rx.Subject(1)

main$
.scan((a, c) => a.concat(c.shareReplay(1)), [])
.map(obs => Rx.Observable.combineLatest(obs))
.switch()
.map(v => v.filter(e => !!e))
.map(v => v.join(','))
.subscribe(v => $('#result').append('<br>' + v))

main$.onNext(s1$)
s1$.onNext(1)
main$.onNext(s2$)
s2$.onNext(void 0) // Since we can't use startWith
main$.onNext(s3$)
s3$.onNext(5)
s1$.onNext(55)
s2$.onNext(12)
s2$.onNext(14)
s3$.onNext(6)
main$.onNext(s4$)
s4$.onNext(999)
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>
<div id="result"></div>

关于javascript - 有办法创建这个流序列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com