【问题标题】:Does RxJs .first() operator (among others) complete the source observable?RxJs .first() 运算符(以及其他)是否完成了可观察的源?
【发布时间】:2019-10-30 04:26:52
【问题描述】:

如果我有以下代码:

const subject = new BehaviorSubject<[]>([]);
const observable = subject.asObservable();
subject.next([{color: 'blue'}])
observable.pipe(first()).subscribe(v => console.log(v))

根据文档:

如果不带参数调用,首先发出源 Observable 的第一个值,然后完成....

这是否意味着源 observable(在本例中为 BehaviorSubject)完成并且您不能再使用它?因为你不能再打电话给.next([...])。

我试图了解如果 observable 上没有 .complete() 方法,它如何完成?

我试图查看first() 的源代码,它在幕后使用take(),而take() 使用lift(),所以我很好奇第一个操作员是否以某种方式返回了源 observable 的副本(主题)并完成。

【问题讨论】:

    标签: rxjs


    【解决方案1】:

    源 observable 没有完成,它完成的是订阅。您可以在 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

    希望我明白你的意思!

    干杯:)

    【讨论】:

    • 这正是我想要的。它unsubscribes() 从而完成了给定的 observable,但源仍然可以使用!太棒了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多