【问题标题】:How can of([1,2,3]).pipe(concatAll()) emit 3 values when of([1,2,3]) emits one?当 of([1,2,3]) 发出 1 个值时,of([1,2,3]).pipe(concatAll()) 如何发出 3 个值?
【发布时间】:2021-01-13 22:30:45
【问题描述】:
of([1,2,3]).subscribe(console.log)

打印:[1,2,3]

但是:

of([1,2,3]).pipe(concatAll()).subscribe(console.log)

打印:

1
2
3

为什么会出现上述情况? 为什么添加concatAll() 会一一发出数组的元素?这不是和concat这个词的意思相反吗?

我觉得concatAll() 的行为会因输入而异。

考虑一下:

from([of(1),of(2),of(3)]).pipe(concatAll()).subscribe(console.log)

它将再次打印:

1
2
3

所以of([1,2,3]).pipe(concatAll()) == from([of(1),of(2),of(3)]).pipe(concatAll())

但是of([1,2,3]) != from([of(1),of(2),of(3)]) 因为订阅后者会打印:

Observable { _isScalar: false, _subscribe: [Function] }
Observable { _isScalar: false, _subscribe: [Function] }
Observable { _isScalar: false, _subscribe: [Function] }

上面等式的右侧对我来说很清楚,但是哪里有文件证明concatAll() 应该分别发出数组的所有值,就像一个可管道的from

【问题讨论】:

    标签: rxjs rxjs6 rxjs-observables rxjs-pipeable-operators


    【解决方案1】:

    所有处理高阶可观察操作符的操作符,执行与 RxJS 的 from 操作符相同的转换。

    即:

    mergeMap(_ => ([1,2,3]))
    

    基本一样

    mergeMap(_ => from([1,2,3]))
    

    在合并/切换/连接 Promise 和其他可迭代对象时效果相同。


    您在行为上看到的差异也归因于 from 创建了一个新的 observable,而高阶 observable 运算符倾向于创建一个新的 observable 定义周围的行为这些 observables 是如何被订阅的。

    所以concatAll 正在添加额外的行为。


    最后,仅仅因为给定示例的两个事物具有相似的输出,并不意味着它们在幕后做同样的事情。

    of([1,2,3]).pipe(concatAll())from([of(1),of(2),of(3)]).pipe(concatAll()) 描述了两组截然不同的行为,在这种情况下,它们向控制台提供相同的输出。

    第一个发出一个数组,并将该数组转换为concatAll() 的数字流。第二个发出三个 observable,并且 concatAll() 仅在前一个完成时订阅每个。它们只发出一个数字就完成了。

    您可以通过第二个示例清楚地看到区别:

    of([1,2,3])from([of(1),of(2),of(3)])

    第一个发出数组,第二个发出三个 observables。这没有改变。

    concat([1,2,3]), &&
    concat(of(1), of(2), of(3))
    

    再次发出相同的输出。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2021-06-22
    相关资源
    最近更新 更多