2016-07-14 76 views
0

编辑:我已经解决了这个问题。请参阅下面的答案,因为它可能有助于某人。如果你知道更好的答案,请发布! :)Angular 2 Http,RxJS无法读取undefined属性'unsubscribe'

我工作的一个Angular 2 Universal API缓存,并有一个这样的ApiService:

import {Http} from '@angular/core'; 

export class ApiService { 
    constructor(private http: Http, private cache: CacheService) 
} 

get(url) { 
    if (cache_data) { 
     //Create new observable from scratch 
     return new Observable(sub => { 
      sub.next(cache_data); 
     }); 
    } else { 
     //Use Angular 2's Http service, which creates an Observable for me 
     return this.http.get(url) 
      .map(res => res.json()) 
      .catch(err => throw err); 
    } 
} 

在另一个服务,在这里我订阅它,我有:

import {ApiService} from './api/api.service'; 

export class ConsumerService { 
    constructor(apiService: ApiService) {} 
    let sub = this.apiService.get('www.example.com') 
     .subscribe(data => { 
      console.log(data); 
      sub.unsubscribe(); 
     }) 
} 

如果请求的数据不在缓存中,并且服务器必须为其发出http请求,则上述代码完美工作。但是,如果缓存中的数据,则会出现以下错误:Cannot read property 'unsubscribe' of undefined 未定义,当然是指我的变量sub

我最初的想法是,我在缓存中创建的Observable类型与Angular 2的Http observable是不同的,因此会产生错误。我试过这个,但没办法确认。任何帮助表示赞赏。

+0

你为什么要在'next'块中调用'unsubscribe'?此外,还有一个单一项目“Observable.of(cached_data)”的创建方法。 – paulpdaniels

+0

你也可以在'sub.next()'后面调用'sub.complete()'完成在完成时自动退订的observable。 – tomastrajan

回答

1

我决定通过保持我的应用程序的异步风格来解决这个问题。我不是仅仅在一个可观察对象中返回我的cache_data,而是首先将它包装在一个Promise中,然后将它包装在一个可观察对象中。

let cacheFromPromise = new Promise(resolve => { 
    resolve(cache_data); 
}); 

return Observable.fromPromise(cacheFromPromise); 

现在一切正常。

+0

你知道为什么会发生这种情况吗?我遇到了完全相同的问题,并且正在做你所做的事情,将Promise变成Observable允许我调用'unsubscribe()'。 –

+0

@KaMok当Observable没有返回任何东西时,这似乎就发生了,所以我上面例子中的sub变量还没有定义。将它包装在一个承诺中 - 强制它是异步的,因此赋予'sub'时间值为 – yazeedb

+0

我使用了'Observable.of(true)',以及'Observable.create()'和3行' .next(true)',它返回'true'。 –