Angular 在RXJS中将可管道运算符提取为函数

Angular 在RXJS中将可管道运算符提取为函数,angular,typescript,rxjs,Angular,Typescript,Rxjs,我有以下代码 this.form.valueChanges.pipe( take(1), map(val => // doSomething), exhaustMap(val => // someInner observable logic return of({someValue}) ) ).subscribe(finalVal => doSomething()); 现在排气图中的代码在几个组件中重复,我想将其提取为

我有以下代码

this.form.valueChanges.pipe(
    take(1),
    map(val => // doSomething),
    exhaustMap(val => 
      // someInner observable logic
      return of({someValue})
    )
).subscribe(finalVal => doSomething());
现在排气图中的代码在几个组件中重复,我想将其提取为一个外部函数

我试过以下方法

  myExhaust(obs: Observable<any>): Observable<{ someValue: SomeClass }> {
    return obs.pipe(
      exhaustMap((val) => { 
           // do some stuff
           return of({someValue})
      })
    );
  }

但是我不知道如何在原始代码中插入它,如果函数代码本身是正确的,那么基本上就是在创建一个自定义操作符。你在正确的轨道上。您必须创建一个函数,该函数接受一个可观察值并返回一个新值

function myExhaust<T>(): MonoTypeOperatorFunction<T> {
    return input$ => input$.pipe(
       exhaustMap((val) => { 
           // do some stuff
           return of({someValue})
       }))
}

现在,您可以在管道中使用myExhaust而不是exaustMap。

您基本上是在创建一个自定义操作符。你在正确的轨道上。您必须创建一个函数,该函数接受一个可观察值并返回一个新值

function myExhaust<T>(): MonoTypeOperatorFunction<T> {
    return input$ => input$.pipe(
       exhaustMap((val) => { 
           // do some stuff
           return of({someValue})
       }))
}

现在,您可以在管道中使用myExhaust而不是exaustMap。

您可以使用此逻辑创建一个常规共享函数,并在任何组件中使用它:

//为您的案例设置适当的泛型类型 //这只是一个例子 导出函数fundata:T:可观察{ //做你的事 数据的返回; } //用法 此.form.valueChanges 管 take1, mapval=>//doSomething, 排气量MAPVAL=>funval .subscribefinalVal=>doSomething;
但是,如果您只需要将此逻辑与exhaustMap运算符组合,则需要自定义管道运算符。

您可以使用此逻辑创建常规共享函数,并在任何组件中使用它:

//为您的案例设置适当的泛型类型 //这只是一个例子 导出函数fundata:T:可观察{ //做你的事 数据的返回; } //用法 此.form.valueChanges 管 take1, mapval=>//doSomething, 排气量MAPVAL=>funval .subscribefinalVal=>doSomething; 但是,如果您只需要将此逻辑与exhaustMap运算符相结合,则需要自定义pipeable运算符。

您的实用程序似乎很好,下面是如何将实用程序传递到管道:

this.form.valueChanges.pipe(
take(1),
 myExhaust,
).subscribe(finalVal => doSomething());
您的实用程序看起来不错,下面是如何将实用程序传递到管道:

this.form.valueChanges.pipe(
take(1),
 myExhaust,
).subscribe(finalVal => doSomething());

将参数传递给自定义运算符如何?将参数传递给自定义运算符如何?