【问题标题】:Diff between Subscription and Subscriber<T> angular2订阅和订阅者之间的差异<T> angular2
【发布时间】:2017-10-27 00:56:43
【问题描述】:

当我在做一些项目时,我遇到了这种类型Subscriber&lt;T&gt;。我无法声明具有适当类型的属性。

问题是当我这样做时,

let sub = this._api.getDefaultMedia().subscriptions.play.subscribe(
            () => {
                this.play();
            }
        );
console.log(sub);

它会打印出Subscriber 类型的以下内容

但是如果我尝试分配一个Subscription 类型的变量

private subPlay : Subscription;

 this.subPlay = this._api.getDefaultMedia().subscriptions.play.subscribe(
            () => {
                this.play();
            }
        );

它给了我以下错误 Type Subscription is not assignable to type Subscription

尽管它说它正在返回 Subscription,但当我执行控制台时,它的类型是 Subscriber

那么这两者有什么不同或相似之处呢?

【问题讨论】:

  • 你的进口是什么? this._api.getDefaultMedia().subscriptions.play 的类型是什么?关于你的最后一个问题,这只是多态性:订阅者扩展订阅。租一辆车时,你不会惊讶于福特,因为福特就是一辆汽车。这里也一样。
  • this._api.getDefaultMedia().subscriptions.play 正在返回 Observable&lt;any&gt;。这是一个videogular2 事件。
  • 你的进口是什么?
  • 由于某种原因无法编辑我的问题,不知道为什么会这样。 import {VgAPI} from "videogular2/src/core/services/vg-api"; import {Observable, Subscription} from "rxjs";
  • 永远不要从 rxjs 导入。这将导致整个库嵌入到您的应用程序中,尽管您可能只使用它的一些类作为运算符。使用import { Observable } from 'rxjs/Observable'; import { Subscription } from 'rxjs/Subscription';

标签: angular rxjs subscription rxjs5 angular2-observables


【解决方案1】:

这有两点:

  1. 类型 Subscription 不能分配给类型 Subscription

    我打赌你导入或声明了其他一些 Subscription 类,现在 TypeScript 尝试将原始 Subscription 形式的 rxjs 包分配给你的自定义 Subscription 类。这就是为什么它抱怨 _subscriptions 属性丢失,否则不会发生。
    https://github.com/ReactiveX/rxjs/blob/master/src/Subscription.ts#L45

  2. subscribe() 方法确实返回了Subscriber 类的实例。

    但是Subscriber extends the Subscription class 所以类型是正确的。如果你使用 TypeScript,编译器不会让你做任何恶意的事情,但如果你只使用 ES6,你可以利用它。我对 RxJS 关于这种情况的一个问题发表了评论:https://github.com/ReactiveX/rxjs/issues/2487#issuecomment-288976689

根据经验,如果您不确定从函数调用返回哪些实例,请始终查看.d.ts 文件。这是 RxJS 的创建者自己推荐的。

subscribe() 调用也不是您遇到行为的唯一地方。例如,所有window*() 运算符都会发出Subject 的实例,而不是Observable。这同样适用于 retryWhen()retryWhen() 运算符。

前段时间我向 RxJS 提交了关于强制使用 Observables 而不是 Subjects 的 PR,由于我在这里总结的原因,它被关闭了。如果您对更深入的解释感兴趣,可以在以下链接中查看它们:

【讨论】:

  • 在我的代码中,我正确使用了订阅。 import {Subscription} from "rxjs/Subscription";。我订阅的事件;可以在这里找到github.com/videogular/videogular2/blob/master/src/core/vg-media/…github.com/videogular/videogular2/blob/master/src/core/vg-media/…
  • 我已将代码放入显示错误的图像中。同一行。
  • @AmitChigadani 当我唯一能看到的只是图像中的一行代码时,我真的无能为力...
  • 我也写过同样的代码。由于某种原因,一小时后我无法编辑我的问题。 this.subPlay=this._api.getDefaultMedia().subscriptions.play.subscribe() // error is shown in this line
  • 我看到了这个,但我想看整个文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2016-02-20
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多