我一直在使用这两种(非常相同的方法)调用throttleTime,但我不确定该实际上是否相同。
this.scrollSubject$ = new Subject<Event>();
this.scrollSubscription$ = this.scrollSubject$
.asObservable()
.throttleTime(400, undefined, { trailing: true })
.subscribe(event => this.throttledScrollHandler(event));
与上述相同,但asObservable
this.scrollSubscription$ = this.scrollSubject$
.throttleTime(400, undefined, { trailing: true})
.subscribe( event => this.throttledScrollHandler(event));
我忘了在我的第二个上添加asObservable
,但它的表现方式相同,这是一个惊喜。这两种方法是否相同?
我在Angular中使用Observables,但我不认为这是Angular特定的
答案 0 :(得分:1)
标题中问题的答案是:是的,如果您想确保无法通过撰写的可观察对象调用主题的next
,error
和complete
方法,应该使用asObservable
。
所以问题中的两个片段不一样。
Subject
实施lift
。这意味着从运算符返回的observable是Subject
。因此,除非调用asObservable
,否则可以在组合的observable上调用next
,error
或complete
。
const subject = new Rx.Subject();
const withoutAsObservable = subject
.do(value => console.log(value));
console.log("withoutAsObservable is a subject:", withoutAsObservable instanceof Rx.Subject);
const withAsObservable = subject
.asObservable()
.do(value => console.log(value));
console.log("withAsObservable is a subject:", withAsObservable instanceof Rx.Subject);
subject.subscribe(
value => console.log("subject value:", value),
error => console.log("subject error:", error)
);
withoutAsObservable.next("some value");
withoutAsObservable.error(new Error("some error"));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>
有关lift
的更多信息,请参阅this issue。
关于你对另一个答案的评论:
我可以调用this.scrollSubscription $ ['next'](new Event('asdf'));和throttledScrollHandler()将打印出该事件
在next
上呼叫Subscription
会调用next
上的Subscriber
方法,该方法是根据您传递给next
的{{1}}函数创建的subscribe
。它对主题没有任何意义,并不等同于调用主题的next
方法。
subscribe
calls toSubscriber
和该订阅者is returned的实施。
Subscriber
extends Subscription
,但它也有next
method。这就是你所说的。