angular - RXJS Observable 移除管道操作符
问题描述
我有一个问题,我想删除/添加任何以前添加的 observable 运算符。
我得到了以下我无法更改的可观察值:
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));
我得到[]
是因为 observable 的输出不再具有类别 1。
我的问题是如何.pipe()
从原始 observable 中删除以添加新的?
解决方案
您不能删除运算符
通过使用pipe
例如调用observable$.pipe( map(..) )
,您并没有真正添加一些observable$
以后可以删除的东西,即使这个短语add operator X to your observable
经常使用是安静的。
Pipeable Operator 是一个函数,它接受一个 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$
和创建不同的 Observable,而不是o2$
使用不同的运算符 on o1$
。但是,您不能删除用于定义o2$
from的函数调用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));
推荐阅读
- ios - Firebase 不再适用于 iOS 颤振
- scala - 如何在 Apache Spark 中填充一个空数组?
- sql - 如何添加另一列来计算 SQL 中所选表的某些列的总比例?
- laravel - 在laravel中将数据从一个表存储到另一个表
- c# - 验证取消后不再调用方法
- php - 如何获取标头值,如果我们不知道该值,因为该值是来自服务器的随机值
- javascript - 在 Sails 版本 1 中使用sails-mongo 时无法加载钩子(`orm`)
- json - FullCalendar/Laravel JSON 事件提要,找不到控制器路由问题
- android - 如何正确创建 Firestore 集合查询的通知?
- ios - 带有自定义单元格的表格视图在滚动时会重复