2017-07-24 43 views
1

我的服務類包含代碼:爲什麼我們在將其轉換爲Promise之前不需要訂閱可觀察的內容?

Service.ts

//all imports are done 
@Injectable() 
export class Service{ 


    constructor(private http: Http) { } 

    getGoogle():Observable<any> { 
     console.log("Inside service"); 
     return this.http.get('https://jsonplaceholder.typicode.com/posts/1'); 
    } 
} 

我的頁面組件,我使用的服務。

Page.ts

//all imports are done 

export class Page1{ 

constructor(private service: Service, private navCtrl: NavController) { } 


async get() { 
    console.log("inside get method"); 
    const data = await this.service.getGoogle().toPromise(); 
     console.log('The response is' , data); 
     } 

} 

我已經得到了需要的結果,但因爲懂得觀測量和觀測的概念,我可觀測應該有一個觀察坐在subscribe.Then爲什麼should'nt的代碼常量data = await this.service.getGoogle.subscribe().toPromise()不在這裏工作了,並顯示錯誤property toPromise() does not exists on type Subscription.

我看到的toPromise()官方資源在那裏我發現它使用.just().toPromise()。然後我發現.just() API其中規定即

just()方法發出其參數作爲OnNext通知,然後在 之後,它發出一個OnCompleted通知。

所以它使用的訂閱功能在這裏,爲什麼它不使用.subscribe()

+0

因爲'toPromise'是一個'Observable'調用 - 不是'Subscription' - 和'toPromise'進行訂閱。 – cartant

+0

此外,您問題中的鏈接引用了RxJS 4文檔。在Angular中使用的RxJS 5 - - 文檔是[here](http://reactivex.io/rxjs/)。 – cartant

回答

2

要獲取可觀察值的值,您將會在可觀察值上得到subscribe()。這將啓動可觀察的事件,它會向您發送它生成的值。

如果您希望使用Promise,則可以改爲在observable上調用toPromise()。這將使可觀察者表現得像一個常規的承諾。

在封面下,toPromise()調用subscribe()上的可觀察值,並等待它發送complete()。當接收到complete()信號時,該承諾將解析最後發射的next()信號。

toPromise()看起來有點像這樣:

myObservable.takeLast().subscribe(value => resolve(value)); 
相關問題