Haben Komponente Funktion ausführen nach dem Dienst http.get-Aufruf beendet ist
Ich habe echt Mühe wickeln meinem Kopf herum observablen und Abonnements in angular2. Das problem, das ich derzeit habe ist Folgendes:
Habe ich einen Dienst, der enthält Methoden post und get Daten aus einer API. Der service injiziert wird in eine Komponente, die direkt Aufrufe dieser Methoden werden in den Dienst. Der service ruft dann die Daten und speichert es selbst, aber dann möchte ich zum verarbeiten der Daten innerhalb der Komponente. Ich kann nicht herausfinden, wie man die Komponente, die eine Funktion ausführen, die nach dem service abgerufen und gespeichert und die Daten selbst.
service.ts
import { Injectable } from 'angular2/core';
import { Http } from 'angular2/router';
@Injectable()
export class Service {
result: Object;
constructor(http: Http) {
this.http = http;
}
httpGet(url) {
return this.http.get(url).subscribe(
result => this.result = result.json(),
error => console.log(error),
() => {}
)
}
}
Komponente.ts
import { Component } from 'angular2/core';
import { Service } from './service';
@Component({
...
})
export class Component {
formattedResult: Object;
constructor(service: Service) {
this.service = service;
this.service.httpGet('/api')
//How do I call format result on service.result only after it is completed?
this.formatResult(service.result) //Need to execute this after the http call is completed
//I want something like:
this.service.httpGet('/api').then(() => formatResult(this.service.result));
}
formatResult(result) {
this.formattedResult = result.map(x => x.length) //For example
}
}
- stackoverflow.com/questions/34739574/...
- Dank seiner Nähe aber ich wollte zu halten .abonnieren Sie in den Dienst, seit es Läden, die Informationen, die sich für den späteren Zugriff. Es ist nicht möglich, zwei .abonniert auf ein http.bekommen (Sie nennen es zweimal). Es sei denn, die anerkannten design-pattern haben .abonnieren Sie nur die Komponenten und explizit den service-Variablen aus der Komponente? Ich wollte dem service-und Komponenten-Logik getrennt ist alles.
- stackoverflow.com/a/34405243/215945 - Antwort-Ketten observablen mit
flatMap()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beantwortung meiner eigenen Frage:
In der app root, import Rxjs mit:
Dadurch erhalten Sie Zugriff auf das vollständige Observable-Objekt (nicht nur das "Beobachtbare-lite" enthalten Eckig). Dies ermöglicht es Ihnen zu .Karte .reduzieren usw. der Http-Anfragen.
Können Sie jetzt verwenden .anzeigen, die auf eine Http-Anfrage durchzuführen, beliebigen code im Kontext des service, auch wenn es ist die Komponente, die abonniert, um das Ergebnis. So das zu erreichen, was ich dargelegt um zu tun in der Anfang, können wir:
service.ts
Komponente.ts
Dank an Gunter und Mark für die Antworten, hat mir geholfen, wickeln Sie meinen Kopf herum, das ein bisschen und ich fühle mich wie ich verstehen Observablen viel besser gegangen durch eine Menge von den docs, dieses problem zu lösen!
Überprüfen, ob das Ergebnis schon da, wenn ja, erstellen Sie ein neues Versprechen und füllen Sie es mit dem Ergebnis, nicht, nicht, ihn zu Holen, und schicken Sie es als Versprechen, als gut.
Ich weiß nicht, TS und dieser code möglicherweise enthalten einige Fehler (ich verwende die Eckigen nur Dart), aber Sie sollten Sie bekommen die Idee.
Siehe auch
- http://blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html
Gut könnten Sie einen call-back-Funktion in diesem Fall,
Beispiel nehmen
berücksichtigen Sie dies, ist die post-Funktion auslöst, der post-service im service-Modul
Hier Hinweis die Funktion
consoleMyOutput()
.Dieser wird ausgelöst, sobald die Antwort bekommen, nachdem der Dienst aufgerufen wurde
Nun,
Diese Funktion wird nur ausgelöst, nachdem die.
Es kann passieren, einfach mit Rxjs Methoden , hier ist eine einfache und klassische Art und Weise, um Dienste aufzurufen, nachdem die Anwendung geladen, dann können wir es abonnieren, es in mehrere Komponenten.
Stellen Sie sicher, dass Dienste sollten wiederverwendbar sein, für alle Komponente, so viel wie u kann das tun-code in Dienstleistungen und anzeigen, abonnieren, nur in Komponente :
Dienstleistungen:
Komponente