2017-07-24 3 views
1

Mein Service-Klasse enthält Code wie:Warum brauchen wir hier keine Observablen zu abonnieren, bevor wir sie in ein Versprechen umwandeln?

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

Meine Seite Komponente, wo ich den Einsatz von Service.

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

} 

Ich habe das gewünschte Ergebnis erhalten, aber wie das Konzept der Observablen und Beobachter zu verstehen, mein beobachtbare soll einen Beobachter muß subscribe.Then sitzen, warum should'nt der Code const data = await this.service.getGoogle.subscribe().toPromise() nicht hier arbeiten und zeigt Fehler, dass property toPromise() does not exists on type Subscription.

ich die offizielle Ressource von toPromise() sah, wo ich fand, dass es mit .just().toPromise() verwendet wird .Dann I .just() API gefunden, die besagt, dass

Die gerade() Methode emittiert seine Parameter (n) als OnNext Benachrichtigungen und Danach sendet sie eine Benachrichtigung OnCompleted.

So ist es mit den Funktionen von hier abonnieren dann, warum es nicht mit .subscribe() verwendet wird?

+0

Weil 'toPromise' ist aufrufbar auf einem' Observable' - kein 'Subscription' - und' toPromise' das Abonnement führt. – cartant

+0

Der Verweis in Ihrer Frage verweist auch auf die RxJS 4-Dokumente. Das RxJS 5 - was in Angular - Docs verwendet wird, ist [hier] (http://reactivex.io/rxjs/). – cartant

Antwort

2

Um die Werte von einer beobachtbaren zu erhalten, werden Sie subscribe() auf der beobachtbaren. Dies startet das Observable und es sendet Ihnen die Werte, die es produziert. Wenn Sie lieber eine Promise verwenden möchten, können Sie toPromise() auf der beobachtbaren stattdessen aufrufen Dadurch wird sich das Observable wie ein normales Versprechen verhalten.

Unter den Abdeckungen ruft toPromise()subscribe() auf dem Observable und wartet auf es senden complete(). Wenn das Signal empfangen wird, löst das Versprechen das zuletzt ausgegebene Signal next() auf.

toPromise() sieht ein bisschen wie folgt aus:

myObservable.takeLast().subscribe(value => resolve(value));