Rxjs throttleTime - 我们需要使用asObservable吗?

时间:2018-01-27 15:28:58

标签: javascript rxjs

我一直在使用这两种(非常相同的方法)调用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特定的

1 个答案:

答案 0 :(得分:1)

标题中问题的答案是:是的,如果您想确保无法通过撰写的可观察对象调用主题的nexterrorcomplete方法,应该使用asObservable

所以问题中的两个片段不一样。

Subject实施lift。这意味着从运算符返回的observable是Subject。因此,除非调用asObservable,否则可以在组合的observable上调用nexterrorcomplete

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。这就是你所说的。