![](/img/trans.png)
[英]combining 3 subjects with combineLatest and return an observable
[英]Angular, 2 subjects, combineLatest not working
$query: Subject<string> = new Subject();
$order: Subject<string> = new Subject();
constructor() {
combineLatest([this.$query, this.$order]).pipe(
debounceTime(300),
startWith([null, 'Oldest'])
).subscribe(([query, order]) => {
console.log('query', query);
console.log('order', order);
});
}
日志只显示一次,在我尝试调用$query.next('sthg')
之后,它不起作用。
有人知道为什么吗? 如果$query
或$order
获得新值,我想记录这些值。 最新的组合不能与主题一起使用吗?
所有源 Observable 都需要至少发出一次,因此您可以使用它:
combineLatest([
this.$query.pipe(startWith(null)),
this.$order.pipe(startWith("Oldest")),
]).pipe(
debounceTime(300),
)
.subscribe(...);
这样,您将获得您期望的第一个发射,然后它应该在每次更改时发射。
根据文档,为了使其工作,两个可观察对象必须发出至少一个值。 你可以尝试这样的事情:
combineLatest([this.$query, this.$order.pipe(startWith("Oldest")]).pipe(
debounceTime(300),
).subscribe(([query, order]) => {
console.log('query', query);
console.log('order', order);
});
然后,当您调用$query.next('sthg')
时,您应该会看到控制台日志。
来自combineLatest (learnrxjs.io)
请注意,在每个 observable 发出至少一个值之前, combineLatest 不会发出初始值。 这与 withLatestFrom 的行为相同,并且可能是一个陷阱,因为不会有 output 并且没有错误,但是您的一个(或多个)内部可观察对象可能无法按预期运行,或者订阅延迟。
我个人使用BehaviorSubject
作为源并添加filter
pipe 以逃避不需要的组合:
combineLatest([this.obs1$, this.obs2$, this.obs3$])
.pipe(
filter((result) => {
let valueObs1 = result[0];
let valueObs2 = result[1];
let valueObs3 = result[2];
if (logic tgo escape)
return false;
return true;
})
)
.subscribe(
(result) => console.log(result),
(error) => console.log(error)
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.