我有一个BehaviorSubject,我希望它能够filter,但是保持它的行为类的质量,新的订阅者在订阅时总是得到一个值,即使最后发出的值被过滤掉了。是否有一种简洁的方法可以使用rxjs的内置函数来实现这一点?例如:
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我已经编写了自己的实现,但如果简单的话,我更希望使用现有运算符的更简单的解决方案。
发布于 2019-04-05 05:44:21
只需使用第二个BehaviorSubject
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);<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>
发布于 2019-04-09 01:31:58
禤浩焯的回答得到了肯定,考虑到rxjs本身的内置运营商,他的回答似乎是最好的方式。它并不完全满足我的需求,所以我在我的小库s-rxjs-utils中发布了我的自定义操作符。它叫filterBehavior()。从医生那里:
工作类似于
filter(),但总是让每个新用户的第一次发射。这使得它适合那些期望可观察到的用户像BehaviorSubject一样运行的订阅者,其中第一次发射是在调用subscribe()期间同步处理的(例如角模板中的async管道)。
发布于 2019-04-05 03:23:37
您的stream已经被管道化以使用isEven筛选器,因此您的初始值1没有显示在控制台中。
如果要查看初始值1,请直接订阅BehaviourSubject
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 goodhttps://stackoverflow.com/questions/55526731
复制相似问题