【发布时间】:2016-07-14 16:46:00
【问题描述】:
编辑:我已经解决了这个问题。请在下面查看我的答案,因为它可能对某人有所帮助。如果您知道更好的答案,请发布! :)
我正在处理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 请求,则上述代码可以完美运行。但是,如果数据 is 在缓存中,我会收到以下错误:Cannot read property 'unsubscribe' of undefined
当然,未定义是指我的变量sub。
我最初的想法是,我在缓存中创建的 Observable 类型与 Angular 2 的 Http observable 不同,因此会产生错误。我已经尝试过对此进行测试,但无法确认。任何帮助表示赞赏。
【问题讨论】:
-
你为什么在
next块中调用unsubscribe?另外已经有单品的创建方法Observable.of(cached_data)。 -
你也可以在
sub.next()之后调用sub.complete()来完成observable,它会在完成时自动取消订阅。