如何解决当 of([1,2,3]) 发出一个值时, of([1,2,3]).pipe(concatAll()) 如何发出 3 个值?
of([1,2,3]).subscribe(console.log)
打印:[1,3]
但是:
of([1,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,3]).pipe(concatAll())
== from([of(1),of(3)]).pipe(concatAll())
但是 of([1,3])
!= from([of(1),of(3)])
因为订阅后者会打印:
Observable { _isScalar: false,_subscribe: [Function] }
Observable { _isScalar: false,_subscribe: [Function] }
上述等式的右边对我来说很清楚,但哪里有记录表明 concatAll()
应该单独发出数组的所有值,就像一个可管道化的 from
?
解决方法
所有处理高阶可观察操作符的操作符,都执行与 RxJS 的 from
操作符相同的转换。
即:
mergeMap(_ => ([1,2,3]))
与
基本相同mergeMap(_ => from([1,3]))
在合并/切换/连接 Promise 和其他可迭代对象时效果相同。
您在行为上看到的差异还归因于 from
创建了一个新的 observable,而高阶 observable 运算符倾向于创建一个新的 observable 和定义围绕如何订阅这些 observable 的行为。
所以 concatAll
增加了额外的行为。
最后,仅仅因为给定示例的两件事具有相似的输出,并不意味着它们在幕后做同样的事情。
of([1,3]).pipe(concatAll())
和 from([of(1),of(2),of(3)]).pipe(concatAll())
描述了两组截然不同的行为,它们在(本例中)为您提供相同的控制台输出。
第一个发出一个数组,并通过 concatAll()
将该数组变成一个数字流。第二个发出三个 observable,并且只有在前一个完成时才让 concatAll() 订阅每个。他们只发出一个数字就完成了。
您可以通过第二个示例清楚地看到区别:
of([1,3])
和 from([of(1),of(3)])
第一个发出和数组,第二个发出三个 observable。这没有改变。
concat([1,3]),&&
concat(of(1),of(3))
再次发出相同的输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。