2016-07-14 21 views
0

EDITのプロパティ「退会」を読み込めません:私は、この問題を解決しました。誰かを助けるかもしれないので、私の答えを見てください。あなたがより良い答えを知っているなら、それを投稿してください!私はAngular 2 Universal APIキャッシュに取り組んでおり、このようなApiServiceを持っています:)角度2 HTTPは、RxJSは未定義

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(); 
     }) 
} 

:私は、私はそれを購読する別のサービス、で

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); 
    } 
} 

要求されたデータがキャッシュになく、サーバーがHTTP要求を行う必要がある場合、上記のコードは完全に機能します。データがキャッシュにをされた場合は、しかし、私は次のエラーを取得する:Cannot read property 'unsubscribe' of undefined は未定義、もちろん、私の変数subを参照しています。

私の最初に考えたのは、私が観察角度2のHTTP対キャッシュに作成してい観測の種類が異なっているので、エラーを作成することです。私はこれをテストしようとしましたが、それを確認する方法はありません。どんな助けもありがとうございます。

+0

なぜあなたは 'next'ブロック内unsubscribe''呼んでいますか?また、Observable.of(cached_data)という単一項目の作成メソッドも既に存在します。 – paulpdaniels

+0

また、 'sub.next()'の後に 'sub.complete()'を呼び出して、完了時に自動的に退会するobservableを完成させることができます。 – tomastrajan

答えて

1

私は自分のアプリケーションの非同期スタイルに保つことによってこの問題を解決することを決めました。私のcache_dataをobservableで返すのではなく、まずPromiseでラップして、それを観測可能なものにラップします。

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

return Observable.fromPromise(cacheFromPromise); 

すべてが今すぐ完全に動作します。

+0

これはなぜ起こるか知っていますか?私はまったく同じ問題を抱えていて、あなたがしたことをやって、PromiseをObservableに変えれば、私はそれに対して 'unsubscribe()'を呼び出すことができます。 –

+0

@KaMokこれはObservableが何も返さないときに起こると思われるので、上の例の 'sub'変数はまだ定義されていません。従って 'sub'時間を与え、それは非同期であるため_forces_約束でそれを包む私は' '使用Observable.of(真の)値 – yazeedb

+0

、同様の'とObservable.create() 'のような3行を割り当てられます' .next(true) 'は' true'を返します。 –