【问题标题】: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 编码的方式,我很喜欢它!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2019-01-30
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        • 1970-01-01
        相关资源
        最近更新 更多