首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤BehaviorSubject

过滤BehaviorSubject
EN

Stack Overflow用户
提问于 2019-04-05 00:36:54
回答 3查看 7K关注 0票数 5

我有一个BehaviorSubject,我希望它能够filter,但是保持它的行为类的质量,新的订阅者在订阅时总是得到一个值,即使最后发出的值被过滤掉了。是否有一种简洁的方法可以使用rxjs的内置函数来实现这一点?例如:

代码语言:javascript
复制
const isEven = (n) => n % 2 === 0;
const source = new BehaviorSubject(1);
const stream = source.pipe(filter(isEven));
stream.subscribe((n) => console.log(n)); // <- I want this to print `1`
source.next(2); // prints `2`; that's good
source.next(3); // does not print anything; that's good

我已经编写了自己的实现,但如果简单的话,我更希望使用现有运算符的更简单的解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-05 05:44:21

只需使用第二个BehaviorSubject

代码语言:javascript
复制
const { BehaviorSubject } = rxjs;
const { filter} = rxjs.operators;

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

source.pipe(filter(isEven)).subscribe(stream);

stream.subscribe(val => { console.log(val); });
source.next(2);
source.next(3);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>

票数 7
EN

Stack Overflow用户

发布于 2019-04-09 01:31:58

禤浩焯的回答得到了肯定,考虑到rxjs本身的内置运营商,他的回答似乎是最好的方式。它并不完全满足我的需求,所以我在我的小库s-rxjs-utils中发布了我的自定义操作符。它叫filterBehavior()。从医生那里:

工作类似于filter(),但总是让每个新用户的第一次发射。这使得它适合那些期望可观察到的用户像BehaviorSubject一样运行的订阅者,其中第一次发射是在调用subscribe()期间同步处理的(例如角模板中的async管道)。

票数 1
EN

Stack Overflow用户

发布于 2019-04-05 03:23:37

您的stream已经被管道化以使用isEven筛选器,因此您的初始值1没有显示在控制台中。

如果要查看初始值1,请直接订阅BehaviourSubject

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55526731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档