请举例说明RxJS映射和switchMap的区别
我看过很多关于这个主题的其他帖子,也读过官方(见下文)和半官方的文档,比如,但我仍然无法理解“地图”和“开关地图”之间的区别,我希望通过下面的具体例子来澄清 注:根据RxJS官方文件:请举例说明RxJS映射和switchMap的区别,rxjs,Rxjs,我看过很多关于这个主题的其他帖子,也读过官方(见下文)和半官方的文档,比如,但我仍然无法理解“地图”和“开关地图”之间的区别,我希望通过下面的具体例子来澄清 注:根据RxJS官方文件: 映射:“将给定的项目函数应用于源可观察对象发出的每个值,并将结果值作为可观察对象发出。” switchMap:“将每个源值投影到一个可观测值,该值合并到输出可观测值中,仅从最近投影的可观测值发出值。” 考虑到我的不完全理解,我做了一些非常简单的例子,参见StackBlitz,但仍然不完全理解为什么有些例子会以
- 映射:“将给定的项目函数应用于源可观察对象发出的每个值,并将结果值作为可观察对象发出。”
- switchMap:“将每个源值投影到一个可观测值,该值合并到输出可观测值中,仅从最近投影的可观测值发出值。”
string
示例:
// String Example 1
const source = of('World').pipe(
map(x => `Hello ${x}!`)
);
source.subscribe(x => console.log(`SOURCE (map): ${x}`));
// SOURCE (map): Hello World!
好吧,很公平,我想我主要明白了
// OBJECT EXAMPLES
const foo = {
"first": 1,
"second": 2
}
// OBJECT EXAMPLE 1
Object.keys(foo).forEach(obj=>of(foo[obj]).pipe(
map(x=>x*2)
).subscribe(x => console.log(`SOURCE (map): ${x}`)))
// SOURCE (map): 2
// SOURCE (map): 4
好吧,很公平。这似乎很简单
// OBJECT EXAMPLE 2
Object.keys(foo).forEach(obj=>of(foo[obj]).pipe(
switchMap(x=>of(x*2)) // WHY DO WE NEED ANOTHER "of()" HERE? "switchMap(x=>x*2)" DOESN'T COMPILE
).subscribe(x=> console.log(`SOURCE (switchMap): ${x}`)))
// SOURCE (switchMap): 2
// SOURCE (switchMap): 4
相当清楚,但为什么我们需要向“switchMap”提供“of(x*2)”?在字符串示例2中,“switchMap”似乎疯狂地发出并自动将其输出包装为可观察的(或者“pipe”是否将输出包装为可观察的?),但无论如何,“switchMap”和“pipe”都不需要任何额外的“of()或任何其他帮助将输出包装为可观察的,但在对象示例2中,我们明确需要提供第二个“of()”,以确保“switchMap”的输出是可观察的,否则代码将无法编译。(但对于“map”,我们不需要提供第二个“of()”)。再一次,一步一步,为什么会有不同
总之,如果有人能解释一下,我将不胜感激:
:接收类型为of
的参数,生成类型为T
的单个通知,然后完成T
:接收类型为map
的参数,每当收到类型为T=>R
的通知时,生成类型为T
的通知R
接收类型为switchMap
的参数,每当收到类型为T=>observativelike
的通知时,都会生成类型为T
的通知R
switchMap
具有一个投影函数,该函数期望将ObservableLike
作为返回类型。这句话的重要部分是可以观察到的- 数组或
- 允诺
from([1,2,3])
我得到的是:
// 1
// 2
// 3
由于string
只不过是Array
,所以RxJS尝试将该字符串转换为它的字符流。(char
在JS中不是真正的数据类型,但字符串内部是一个数组)
i、 e.这些是平等的:
from(['a','b','c'])
from('abc')
开关映射
提供一个可观察类
,但是字符串
类型恰好是一个可观察类
——只是一个字符流这很有帮助,但仍有以下几个问题:1。官方文件指出,map“将给定的项目函数应用于源可观测值发出的每个值,并将结果值作为可观测值发出。”您指出
map
返回类型R。R本身是可观测的(即可观测的),还是R不是可观测的,或者不一定是可观测的?即。,什么是类型R
?我在Typescript泛型R
上做了一些Web搜索,但没有找到任何结果。是吗
// 1
// 2
// 3