Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 理解rxjs中的switchmap_Node.js_Reactjs_Angularjs_React Native_Rxjs - Fatal编程技术网

Node.js 理解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"));

我是rxjs的新手。我正在尝试理解switchmap的功能。为了理解,我编写了以下代码

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()

我已经编写了您的代码,因此可能更容易理解为什么您总是得到“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()