【问题标题】:Advantages of observables to async interators可观察对象对异步迭代器的优势
【发布时间】:2019-06-28 03:34:13
【问题描述】:
Observables 以异步方式推送他们的数据,我感兴趣的是它们如何与拉取数据的对应对象(即异步迭代)进行比较。
我遇到了这个ReactiveX article
您可以将 Observable 类视为等效于 Iterable 的“推”,即“拉”。使用 Iterable,消费者从生产者那里拉取值,线程阻塞,直到这些值到达。相比之下,对于 Observable,只要值可用,生产者就会将值推送给消费者。 这种方法更灵活,因为值可以同步或异步到达。
特别是,我不明白最后引用的那一行。有人可以解释一下推送的好处吗?
【问题讨论】:
标签:
javascript
ecmascript-6
rxjs
reactivex
【解决方案1】:
Observables 异步推送数据
这是不正确的。它可以是同步的和异步的
您帖子中的引用指向
[Symbol.iterator],而不是新的 ES2015
[Symbol.asyncIterator]。
这种方法更灵活,因为值可以到达
同步或异步
因此,与[Symbol.iterator] 相比,Observable 不会阻塞线程,并且可以同时在同步和异步源上工作。
将 Observable 与 [Symbol.asyncIterator] 进行比较,这是 MDN 的重要引述:
目前没有内置的 JavaScript 对象具有
[Symbol.asyncIterator] 默认设置的键
所以[Symbol.asyncIterator] 与Observable:
[Symbol.asyncIterator]:
const myAsyncIterable = new Object();
myAsyncIterable[Symbol.asyncIterator] = async function*() {
yield "hello";
yield "async";
yield "iteration!";
};
(async () => {
for await (const x of myAsyncIterable) {
console.log(x);
// expected output:
// "hello"
// "async"
// "iteration!"
}
})();
可观察:
of('hello', 'async', 'iteration!').subscribe(console.log)
【解决方案2】:
使用 Rx,您的编程范式发生了变化,您的数据通过 Streams 流动。
它改变了操作数据的方式,从从数组中“提取”值并对其进行处理,到期望数据通过您的流程“推送”。 Rx 允许您以不同的方式使用流过滤、映射、去抖动数据,还可以根据需要异步映射数据。
今年我改变了使用 Rx 编码的方式,我很喜欢它!