Rxjs 筛选行为主体

Rxjs 筛选行为主体,rxjs,Rxjs,我有一个行为主体,我希望能够过滤,但保持其行为主体般的质量,即新订阅者在订阅时始终获得一个值,即使最后发出的值被过滤掉。有没有一种简洁的方法可以使用rxjs中的内置函数来实现这一点?例如: const isEven=(n)=>n%2==0; 常量源=新行为主体(1); const stream=source.pipe(过滤器(isEven)); stream.subscribe((n)=>console.log(n));// 您的流已通过管道使用isEven过滤器,因此您的初始值1未显示在控制台

我有一个
行为主体
,我希望能够
过滤
,但保持其行为主体般的质量,即新订阅者在订阅时始终获得一个值,即使最后发出的值被过滤掉。有没有一种简洁的方法可以使用rxjs中的内置函数来实现这一点?例如:

const isEven=(n)=>n%2==0;
常量源=新行为主体(1);
const stream=source.pipe(过滤器(isEven));

stream.subscribe((n)=>console.log(n));// 您的
已通过管道使用
isEven
过滤器,因此您的初始值1未显示在控制台中,因此您的行为符合预期

如果要查看初始值1,请直接订阅
行为主题

const isEven = (n) => n % 2 === 0;
const source = new BehaviorSubject(1);
const stream = source.pipe(filter(isEven));

// should print 1, and should print 2 and 3 when your source is nexted.
source.subscribe((n) => console.log(n)); 

stream.subscribe((n) => console.log(n)); // <- should NOT Print 1, because it has been filtered
source.next(2); // prints `2`; that's good
source.next(3); // does not print anything; that's good
const isEven=(n)=>n%2==0;
常量源=新行为主体(1);
const stream=source.pipe(过滤器(isEven));
//应打印1,并应打印2和3时,你的来源是下一个。
source.subscribe((n)=>console.log(n));

stream.subscribe((n)=>console.log(n));// 只需使用第二个BehaviorSubject

const{BehaviorSubject}=rxjs;
const{filter}=rxjs.operators;
常数isEven=(n)=>n%2==0;
常量源=新行为主体(1);
const stream=new BehaviorSubject(source.getValue());
source.pipe(filter(isEven)).subscribe(stream);
stream.subscribe(val=>{console.log(val);});
资料来源:下一(2);
资料来源:下一(3)

阿德里安的答案获得了好评,考虑到
rxjs
本身的内置运营商,他似乎是最好的答案。它不能完全满足我的需要,所以我在我的小库中发布了我的自定义操作符。它叫。从文档中:

工作原理类似于
filter()
,但始终允许每个新订户通过第一次发射。这使得它适用于期望可观察对象的行为类似于
行为子对象的订阅者,在调用
subscribe()
(例如角度模板中的
async
管道)的过程中同步处理第一次发射


对不起,我的问题一定用词不当。我知道这就是为什么它表现得不同,我想知道如何让它表现得那样。我想知道如何构造
,以便在我列出的时间打印东西。我会回去试着重新表述这个问题。好的,这相当简单。酷。我想中间部分也可以简化为
source.pipe(filter(isEven)).subscribe(stream)
。我意识到在我下班后,周五下午很晚了,啤酒点打电话来了。如果过滤器是假的,你会怎么做,
stream
被分配了一个默认值,而根本没有得到一个新值?看来我应该使用
map
而不是
filter
(请原谅我对RxJS的陌生)