gpt4 book ai didi

javascript - 如何在 RxJS5 中应用定时背压?

转载 作者:数据小太阳 更新时间:2023-10-29 04:17:46 25 4
gpt4 key购买 nike

假设我有以下代码:

let a = Rx.Observable.of(1, 2, 3)
let b = Observable.zip(a, a, (a, b) => a + b)
b.forEach(t => console.log(t))

这会立即输出结果。现在,我如何在每条消息之间设置一个定时延迟作为背压方式(请注意,我不需要缓冲区;相反,我想要ab 成为 Cold Observables),例如:

b.takeEvery(1000).forEach(t => console.log(t))

并得到完全相同的答案:

<wait 1s>
2
<wait 1s>
4
<wait 1s>
6

替代方案:如果 RxJS 不支持背压(某些可观察对象的拉动机制),那么如何在不耗尽资源的情况下创建无限生成器?

备选方案2:其他同时支持pull和push机制的JS框架?

最佳答案

在不支持 RxJS 5.x 背压的情况下,但是有例如 pausable operator在 4.x 版本中。它仅适用于热可观察对象。更多关于背压的信息 4.xhere (特别是在底部和RxJS相关描述中抢劫)。

这条 Erik Meijer 的推文可能有点争议但相关:https://twitter.com/headinthebox/status/774635475071934464

对于您自己的背压机制的实现,您需要有 2 路通信 channel ,这可以很容易地用 2 个主题创建 - 每端一个。基本上使用 next 发送消息和 .subscribe 列表到另一端。

创建生成器也是可行的 - 再次使用主题在基于推和基于拉的世界之间架起桥梁。下面是生成斐波那契数列的示例性实现。

const fib = () => {
const n = new Rx.Subject()
const f = n
.scan(c => ({ a: c.b, b: c.b + c.a }), { a: 0, b: 1 })
.map(c => c.a)

return {
$: f,
next: () => n.next()
}
}

const f = fib()

f.$.subscribe(n => document.querySelector('#r').innerHTML = n)
Rx.Observable.fromEvent(document.querySelector('#f'), 'click')
.do(f.next)
.subscribe()
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>

<button id='f'>NEXT FIBONACCI</button>

<div id='r'>_?_<div>

您可能感兴趣的另一个 js 库是 https://github.com/ubolonton/js-csp - 没有使用它,所以不确定它如何处理背压。

关于javascript - 如何在 RxJS5 中应用定时背压?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48493924/

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