作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
假设我有以下代码:
let a = Rx.Observable.of(1, 2, 3)
let b = Observable.zip(a, a, (a, b) => a + b)
b.forEach(t => console.log(t))
这会立即输出结果。现在,我如何在每条消息之间设置一个定时延迟作为背压方式(请注意,我不需要缓冲区;相反,我想要a
和b
成为 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.x和 here (特别是在底部和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/
我是一名优秀的程序员,十分优秀!