如果我有以下代码:
const subject = new BehaviorSubject<[]>([]);
const observable = subject.asObservable();
subject.next([{color: 'blue'}])
observable.pipe(first()).subscribe(v => console.log(v))
根据文档:
如果不带任何参数调用,则首先发出来源Observable的第一个值,然后完成。...
这是否意味着可观察到的源(在这种情况下为BehaviorSubject)完成并且您不能再使用它?因为您无法再对其调用.next([...])
。
我试图了解如果没有.complete()
方法的可观察对象如何完成?
我正在尝试查看first()
的源代码,该源代码在幕后使用take()
,然后依次使用take()
使用lift()
,所以我很好奇第一个运算符返回可观察源(主题)的副本,并完成该操作。
答案 0 :(得分:1)
可观察的源未完成,完成的是订阅。您可以在Observable源上进行多个订阅,在这种情况下,您可以使用一个BehaviorSubject。
subject.next([{color: 'blue'}])
subject.next([{color: 'red'}])
const subs1 = observable.pipe(first()).subscribe(v => console.log(v))
const subs2 = observable.subscribe(v => console.log(v))
在上面的示例中,您清楚地看到源尚未完成,仅是订阅。
如果您想尝试的话,我已经创建了Stackblitz:https://stackblitz.com/edit/rxjs-uv6h6i
希望我明白你的意思!
干杯:)