RXJS可观察到的删除管道运算符

卢克·克鲁恩

我有一个要删除/添加可观察对象的以前添加的运算符的问题。

我得到以下不能更改的可观察值:

let objects$ = of([{
      category: 1,
      name: 'Some1'
    }, {
      category: 2,
      name: 'Some2'
    }]).pipe(
      map(o => o.filter(b => b.category === 2))
    )
    objects$.subscribe(obj => console.log(obj));

输出:{category: 2,name: 'Some2'}如预期。

现在,我想将过滤器的值更改b.category === 1为output {category: 1,name: 'Some1'}

如果我执行以下操作:

objects$.pipe(
      map(o => o.filter(b => b.category === 1))
    )
    objects$.subscribe(obj => console.log(obj));

我还是{category: 2,name: 'Some2'}

如果我做:

objects$ = objects$.pipe(
      map(o => o.filter(b => b.category === 1))
    )
    objects$.subscribe(obj => console.log(obj));

我得到了,[]因为可观察的输出不再具有类别1。

我的问题是如何.pipe()从原始的可观察者中删除来添加新的?

朋友

您无法删除运算符

通过使用pipe例如呼叫,observable$.pipe( map(..) )您实际上并没有在observable$后面添加一些可以删除的内容,即使该短语add operator X to your observable通常很安静。

管道运算符是将Observable作为其输入并返回另一个Observable的函数。这是一个纯操作:之前的Observable保持不变

const o1$ = of('1');
const o2$ = o1$.pipe(
  map(x => x + '2'),
  map(x => x + '3')
);

相当于

const o1$ = of('1');
const o2$ = map(x => x + '3')(
  map(x => x + '2')(
    o1$
  )
);

您基本上是将纯函数调用与原始Observableo1$作为输入链接,并将其他一些Observable作为输出链接起来。o1$不会被更改,因此您必须将返回值分配给变量(o2$),以供以后使用或直接使用它以产生效果。

在上面的示例中,您可以重用o1$并创建一个与o2$通过在上使用不同的运算符不同的Observable o1$但是,您不能删除用于定义函数调用o2$o2$

您应该能够更改自己关心的实施细节

如果为您提供了Observable,则您无法更改,则不必担心它的特定实现,而不必担心它发出的内容。在这种情况下,Observable对您来说是一个黑匣子,据您所知,它只是发出光{ category: 2, name: 'Some2' }您不知道也不应该关心Observable在发出此值的过程中所做的特定操作。

但是您似乎知道并关心Observable在发出此值之前做了什么。如果这样做,您(或同事)必须有一种方法来更改Observable的实现。

动态注入代码

如果您的代码中一个部分应该固定而另一部分应该是动态的,则可以定义一个接受另一个函数(动态部分)作为输入的高阶函数(固定部分),并以此方式从一个原始Observable创建不同的Observable:

let getObjects$ = (predicate: (value: any) => boolean) => of([
  {
    category: 1,
    name: "Some1"
  },
  {
    category: 2,
    name: "Some2"
  }
]).pipe(map(o => o.filter(predicate)));

getObjects$(v => v.category === 1).subscribe(obj => console.log(obj));
getObjects$(v => v.category === 2).subscribe(obj => console.log(obj));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用扫描运算符计算可观察到的空隙的发射值?

未定义可观察到的异步运算符

如何确保可观察到的运算符在HTTP拦截器之后发生?

管道RxJS可观察到的现有主题

RxJS运算符将可观察值组成状态?

RxJS6:为什么可观察的管道运算符仅接收OperatorFunction而不接收MonoTypeOperatorFunction

RxJs数组可观察到的数组

rxjs可观察到的更改间隔

rxjs可观察到的导入问题

RxJs可观察到的重复值

Rx运算符,每次可观察到的源发出新事件时,将“ n”个最新项作为列表发出

通过添加,过滤或删除项目来更新可观察到的Rxjs数组

通过异步管道重新分配可观察到的

可观察到的异步管道未返回值

异步管道未显示可观察到的数据

Angular管道内可观察到的HTML过滤请求

RxSwift配置可在Zip运算符中观察到

在RXJS中找到合适的运算符以映射/减少可观察对象的内部条目

RxJS运算符用于左连接2个可观察对象

如何使用RXJS运算符基于重复值对Firebase可观察列表进行排序

使用 rxjs 运算符调查激活的路由可观察量

RxJs .first() 运算符(以及其他)是否完成了源可观察?

RxJS catchError运算符不会在Promise创建的可观察对象上捕获错误

Rxjs可观察到,直到满足某些条件

可观察到的rxJs回调是异步的

可观察到使用共享的RxJS重新连接WebSocket

RxJS键入错误缺少可观察到的

从HttpModule中可观察到的RxJS检索数据

等价于rxjs中可观察到的redux'getState'