2016-07-14 61 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'。 –

相關問題