我有一个要删除/添加可观察对象的以前添加的运算符的问题。
我得到以下不能更改的可观察值:
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] 删除。
我来说两句