Node.js 理解rxjs中的switchmap
我是rxjs的新手。我正在尝试理解switchmap的功能。为了理解,我编写了以下代码Node.js 理解rxjs中的switchmap,node.js,reactjs,angularjs,react-native,rxjs,Node.js,Reactjs,Angularjs,React Native,Rxjs,我是rxjs的新手。我正在尝试理解switchmap的功能。为了理解,我编写了以下代码 const fun1 = () => { return new Promise((resolve, reject) => resolve("Fun1")); }; const fun2 = () => { return new Promise((resolve, reject) => resolve("Fun2"));
const fun1 = () => {
return new Promise((resolve, reject) => resolve("Fun1"));
};
const fun2 = () => {
return new Promise((resolve, reject) => resolve("Fun2"));
};
const fun3 = () => {
return new Promise((resolve, reject) => resolve("Fun3"));
};
const observer = from(fun()).pipe(
switchMap((result1) => {
return from(fun1());
}),
switchMap((result2) => {
return from(fun2())
}),
switchMap((result3) => {
return from(fun3());
})
);
observer.subscribe(
(val) => console.log("Val =", val),
(error) => console.log("Error = ", error),
() => console.log("Completed")
);
上述代码将Fun3返回给订阅者
但我的期望是,如果fun2()返回带有“fun2”字符串的承诺,那么代码不应该使用from(fun3())执行switchmap;代码应该将“Fun2”返回给订阅者。如何在上述代码中实现此功能。switchMap,如exhaustMap或mergeMap,用于展平观测值的可观测值。switchMap的特殊之处在于,如果您的源可观测值(在您的情况下:from(fun())),发出一个新值,switchMap操作符将在订阅新值之前取消订阅以前的内部可观测值。 因此,您将始终只有一个内部订阅。 这篇ng conf演讲完美地解释了这一点: 在您的示例中,您使用管道函数来管道三个开关映射。您的可观测值(在subscribe方法中)将始终是您在管道函数中进行的最后一次转换(在您的示例中(“Fun3”)) 对于您的特定示例,您可以执行以下操作:
const observer = from(fun).pipe(
switchMap((result2) => {
return from(fun2()).pipe(
catchError(error => fun3())
)
})
);
这样,只有在fun2()拒绝时才会调用fun3(),否则您的订户将收到fun2()的结果
但我强烈建议您观看这场仅20分钟的演讲,并真正解释switchMap的作用。switchMap与exhaustMap或mergeMap一样,用于展平观测值的可观测值。switchMap的特殊之处在于,如果您的源观测值(在您的案例中:from(fun())),发出一个新值,switchMap操作符将在订阅新值之前取消订阅以前的内部可观测值。 因此,您将始终只有一个内部订阅。 这篇ng conf演讲完美地解释了这一点: 在您的示例中,您使用管道函数来管道三个开关映射。您的可观测值(在subscribe方法中)将始终是您在管道函数中进行的最后一次转换(在您的示例中(“Fun3”)) 对于您的特定示例,您可以执行以下操作:
const observer = from(fun).pipe(
switchMap((result2) => {
return from(fun2()).pipe(
catchError(error => fun3())
)
})
);
这样,只有在fun2()拒绝时才会调用fun3(),否则您的订户将收到fun2()的结果
但我强烈建议您观看这场仅20分钟的演讲,并真正解释switchMap的功能。我已经编写了您的代码,因此可能更容易理解为什么您总是得到“fun3”
const fun1=()=>of(“fun1”);
常量fun2=()=>of(“fun2”);
常量fun3=()=>of(“fun3”);
const observable=from(fun()).pipe(
开关映射(=>fun1()),
开关映射(=>fun2()),
开关映射(=>fun3()),
);
订阅({
下一步:val=>console.log(“val=”,val),
错误:err=>console.log(“error=,err),
完成:()=>console.log(“已完成”)
});
首先,注意我的switchMaps是如何忽略它们的输入的?这应该给你一个提示,即忽略了来自前一个可观察对象的“返回值”
switchMap(=>fun1())
的意思是“每当源可观察对象发出一个值(我不关心该值是什么),然后订阅由fun1
返回的可观察对象”
下面是另一个例子:
const observable=from(fun()).pipe(
开关映射(结果=>result==“Fun2”?(结果):fun1()),
开关映射(结果=>result==“Fun2”?(结果):Fun2()),
开关映射(结果=>result==“Fun2”?(结果):fun3()),
);
现在,您有了检查中间结果的观察值
- 第一个结果是
fun()
- 第二个结果是
,因为这也不是“Fun1”
,所以调用“Fun2”
Fun2()
- 第三个结果是
!啊哈!现在我们返回一个发出“Fun2”
而不是调用“Fun2”
fun3()
const fun1=()=>of(“fun1”);
常量fun2=()=>of(“fun2”);
常量fun3=()=>of(“fun3”);
const observable=from(fun()).pipe(
开关映射(=>fun1()),
开关映射(=>fun2()),
开关映射(=>fun3()),
);
订阅({
下一步:val=>console.log(“val=”,val),
错误:err=>console.log(“error=,err),
完成:()=>console.log(“已完成”)
});
首先,注意我的switchMaps是如何忽略它们的输入的?这应该给你一个提示,即忽略了来自前一个可观察对象的“返回值”
switchMap(=>fun1())
的意思是“每当源可观察对象发出一个值(我不关心该值是什么),然后订阅由fun1
返回的可观察对象”
下面是另一个例子:
const observable=from(fun()).pipe(
开关映射(结果=>result==“Fun2”?(结果):fun1()),
开关映射(结果=>result==“Fun2”?(结果):Fun2()),
开关映射(结果=>result==“Fun2”?(结果):fun3()),
);
现在,您有了检查中间结果的观察值
- 第一个结果是
fun()
- 第二个结果是
,因为这也不是“Fun1”
,所以调用“Fun2”
Fun2()
- 第三个结果是
!啊哈!现在我们返回一个发出“Fun2”
而不是调用“Fun2”
fun3()