最近我一直在挂这个话题。看起来AsyncIterables和Observables都具有类似流的质量,尽管它们的使用方式有所不同。
您可以像这样消耗异步迭代器
const myAsyncIterable = async function*() { yield 1; yield 2; yield 3; }
const main = async () => {
for await (const number of myAsyncIterable()) {
console.log(number)
}
}
main()
您可以消耗这样的可观察物
const Observable = rxjs
const { map } = rxjs.operators
Observable.of(1, 2, 3).subscribe(x => console.log(x))
<script src="https://unpkg.com/rxjs/bundles/rxjs.umd.min.js"></script>
我的首要问题基于此RxJS pr
如果可观察对象的发射速度快于循环完成的速度,则随着缓冲区变得更满,将建立一个内存。我们可以提供其他使用不同策略的方法(例如,仅使用最新值等),但将其保留为默认设置。请注意,循环本身可能有几个等待项,这使问题更加严重。
在我看来,异步迭代器本来就没有背压问题,因此在Observable上实现Symbol.asyncIterator
(@@ asyncIterator)并默认为背压策略是否正确?根据AsyncIterables甚至需要Observables吗?
主要区别在于哪一方决定何时进行迭代。
对于异步迭代器,客户端通过调用await iterator.next()
来决定。消息源决定何时兑现承诺,但客户必须先要求下一个值。
Observables注册一个回调函数,当有新值传入时,被Observable立即调用。