Angular2 Observables - 创建我自己的 - 订阅者未定义

Posted

技术标签:

【中文标题】Angular2 Observables - 创建我自己的 - 订阅者未定义【英文标题】:Angular2 Observables - Creating my own - subscriber undefined 【发布时间】:2016-09-20 01:48:08 【问题描述】:

我不能完全确定这是一个范围问题还是我如何设置我的 observables 的问题,但也许你可以提供帮助。

首先,我的逻辑。 我的总体目标是能够在发送 http.get 请求之前检查某些数据是否在本地保存。我想做的是返回本地保存的数据(如果存在),我认为我可以让它返回一个可观察的,这样我就可以订阅这个函数的输出,不管它返回的是本地数据还是远程数据.对此逻辑的任何想法将不胜感激!

我正在关注 this blog post by Cory Rylan 来实现我自己的 observable。我遇到了一个问题,我无法在 getData 函数中定义我的观察者。

Here is Cory's working demo

Here is my not-working demo - 您可以在日志中看到服务中的this._dataObserver 是未定义的,而在 Cory 中是未定义的。这就是导致我出现问题的原因。

以下是代码中的 sn-ps:

App.ts

@Component(
  selector: 'my-app',
  template: `
    <landing-page></landing-page>    
  `,
  providers: [DataService],
  directives: [LandingPageComponent]
)
export class App 
  constructor()  


bootstrap(App, [HTTP_BINDINGS])
  .catch(err => console.error(err));

LandingPageComponent.ts

@Component(
  selector: 'landing-page',
  template : `
    hello
  `,
)
export class LandingPageComponent implements OnInit
  data : Observable<any[]>;
  constructor(
    private _dataService : DataService
  )  

  ngOnInit() 
    this.data = this._dataService.data$;
    this._dataService.getData();
  

数据服务

@Injectable()
export class DataService 

   data$ : Observable<any[]>; // data stream
   private _baseUrl: string;
   private _dataObserver : Observer<any[]>;
   private _dataStore : 
    data : any[]
   ;

  constructor (
    private _http: Http
  ) 
    this._baseUrl  = 'http://56e05c3213da80110013eba3.mockapi.io/api';
    this.data$ =  new Observable(observer => this._todosObserver = observer).share();
    this._dataStore =  data: [] ;
  

  /** **************
  * Public functions
  *****************/

  getData () 
    this._http.get(`$this._baseUrl/todos`)
      .map(data => data.json())
      .subscribe( data => 
      this._dataStore.data = data;
      console.log(this._dataObserver);   //<------ This is undefined for me!
      this._dataObserver.next(this.data);
    ,
    error => 
      console.log('couldn\'t load data! ' + error );
    );

  


感谢您的意见

【问题讨论】:

【参考方案1】:

_dataObserver 为 null,因为您没有订阅相关的 observable。不要忘记 observables 是惰性的......

您可以尝试以下方法:

ngOnInit() 
  this.data = this._dataService.data$.subscribe(data =>  // <-----
    console.log(data);
  );
  this._dataService.getData();

编辑

另外,你的代码有错别字:

this.data$ =  new Observable(observer => this._todosObserver = observer).share();

您应该使用_dataObserver 而不是_todosObserver

this.data$ =  new Observable(observer => this._dataObserver = observer).share();

【讨论】:

不幸的是,在调用返回到landingPageComponent 之前,我收到了一个与 Observable 相关的错误。该服务无法调用this._dataObserver.next(this.data),因为this._dataObserver 未定义。这与我将这行代码添加到组件之前遇到的错误相同。 也许这是一个错字,但在初始化 observable 时,您在代码中使用了 _todosObserver 而不是 _dataObserver。见new Observable(observer =&gt; this._todosObserver = observer).share() 多么烦人,解决方案就是这么简单!谢谢蒂埃里,我显然需要一双新鲜的眼睛。如果您将此作为答案,我会接受。 编辑我也需要这样做,所以我将其标记为正确答案。谢谢!

以上是关于Angular2 Observables - 创建我自己的 - 订阅者未定义的主要内容,如果未能解决你的问题,请参考以下文章

markdown Angular2 Snippets - Observables

在 Angular2 中使用 RxJS 链接 observables

Angular2 http observables - 如何使用未定义的类型

Angular 2 observables:防止组件的变化冒泡

Angular 2 使用 observables 缓存 http 请求

Angular 2 变化检测与 observables