【发布时间】:2023-03-08 02:55:01
【问题描述】:
我最近对这个话题很感兴趣。似乎 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()
你可以像这样消费一个 observable
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 的发射速度比循环完成的速度快,那么随着缓冲区越来越满,内存就会增加。我们可以提供使用不同策略的其他方法(例如,仅使用最近的值等),但将其保留为默认值。请注意,循环本身可能有多个等待,这会加剧问题。
在我看来,异步迭代器本质上没有背压问题,那么在 Observable 上实现 Symbol.asyncIterator (@@asyncIterator) 并默认使用背压策略是否正确?鉴于 AsyncIterables,甚至还需要 Observables 吗?
理想情况下,您可以通过代码示例向我展示 AsyncIterables 和 Observables 之间的实际区别。
【问题讨论】:
-
“默认为背压策略”是什么意思?
-
您似乎已经回答了正文中标题中的问题(异步迭代是基于拉的,可观察的是基于推的)。你真的想知道其中的区别吗?
-
@Bergi 特别是,当缓冲区变得更满时允许内存建立的背压策略(正如贡献者似乎暗示的那样)。不,对我来说这听起来不是一个好策略。另外,我可能只是稍微回答了我的问题,但我正在寻找更充实的东西。
-
“我们是否需要规范中的 Observable?” - 这是一个基于意见的问题,我们无法在此回答。不过,您链接的提案文本应该为此提供很好的论据。
-
非常接近(迭代器与可迭代)重复:What is the difference between async generators and Observables?
标签: javascript ecmascript-6 promise rxjs observable