Rxjs 当of([1,2,3])发出一个值时,of([1,2,3]).pipe(concatAll())如何发出三个值?

Rxjs 当of([1,2,3])发出一个值时,of([1,2,3]).pipe(concatAll())如何发出三个值?,rxjs,rxjs6,rxjs-observables,rxjs-pipeable-operators,Rxjs,Rxjs6,Rxjs Observables,Rxjs Pipeable Operators,打印:[1,2,3] 但是: 印刷品: of([1,2,3]).pipe(concatAll()).subscribe(console.log) 为什么会发生上述情况?为什么添加concatAll()会逐个发出数组元素?这不正是concat这个词的相反意思吗 我觉得concatAll()根据输入的不同而不同 还要考虑这一点: 1 2 3 它将再次打印: from([of(1),of(2),of(3)]).pipe(concatAll()).subscribe(console.log) 所以

打印:
[1,2,3]

但是:

印刷品:

of([1,2,3]).pipe(concatAll()).subscribe(console.log)
为什么会发生上述情况?为什么添加
concatAll()
会逐个发出数组元素?这不正是concat这个词的相反意思吗

我觉得
concatAll()
根据输入的不同而不同

还要考虑这一点:

1
2
3
它将再次打印:

from([of(1),of(2),of(3)]).pipe(concatAll()).subscribe(console.log)
所以([1,2,3]).pipe(concatAll())=
来自([of(1),of(2),of(3)]).pipe(concatAll())

但是([1,2,3])的
=
来自([of(1)、of(2)、of(3)])
,因为订阅后者将打印:

1
2
3

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

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

即:

Observable { _isScalar: false, _subscribe: [Function] }
Observable { _isScalar: false, _subscribe: [Function] }
Observable { _isScalar: false, _subscribe: [Function] }
基本上与

mergeMap(_ => ([1,2,3]))
这在合并/切换/连接承诺和其他易受攻击性时同样有效


您在行为中看到的差异还归因于这样一个事实,即
from
创建了一个新的可观察对象,而高阶可观察操作符倾向于创建一个新的可观察对象,并且围绕这些可观察对象的订阅方式定义行为

因此,
concatAll
增加了额外的行为


最后,对于一个给定的例子,仅仅因为两件事情有相似的输出,并不意味着它们在幕后做相同的事情

of([1,2,3]).pipe(concatAll())
from([of(1),of(2),of(3)]).pipe(concatAll())
描述了两组非常不同的行为,在(本例中)它们向控制台提供相同的输出

第一个发出一个数组,并通过
concatAll()
将该数组转换为数字流。第二个发出三个可观测值,并且只有在前一个完成时才有concatAll()订阅每个可观测值。它们只发出一个数字就完成了

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

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

第一个发射和阵列,第二个发射三个可见光。这一点没有改变

mergeMap(_ => from([1,2,3]))
再次发出相同的输出

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