2016-04-27 8 views
0

Ich verpasse wahrscheinlich etwas sehr Offensichtliches, aber was ich versuche zu tun ist, Daten, die ich von einem Server bekomme, asynchron zwischen Komponenten zu teilen. DieseGemeinsame Nutzung von asynchronen Daten im Service angular2

ist, was mein Dienst wie folgt aussieht:

import {Injectable} from 'angular2/core'; 
import {ApiService} from './api.service'; 

@Injectable() 
export class UserService { 
    private user: Object 

    constructor(private _api: ApiService) {} 

    getUser(user) { 
     return this.user 
    } 

    setUser(slug) { 
     return Promise.resolve(this._api.GET('users/' + slug + '/?slug=true').subscribe(
      data => { this.user = data.json; return data.json; }, 
      (err)=>console.log(err) 
     )) 
    } 
} 

Da der Prozess asynchron Ich brauche die Antwort auf Versprechen, aber die versprochene Antwort gibt das eigentliche Objekt abonnieren, nicht zurück data.json.

Dies ist für eine Profilseite, es besteht aus verschachtelten Routen, so kann ich keine Daten an die gerouteten Komponenten übergeben. Eine der gerouteten Komponenten ist Posts, und nach dem Laden des Profils sollte dies beginnen, Posts des aktuellen Benutzers im Dienst zu holen.

So ist das, was ich geschehen müssen:

  1. Benutzer zu sein/ihr Profil geht.
  2. Serviceaufrufe setUser ('foo'), sobald Antwort, zeigen Profilseite.
  3. holen die Post des Benutzers in die Beiträge Komponente der getUser Dienst mit()

Die api-Dienst wie folgt aussieht:

import {Injectable} from 'angular2/core'; 
import {Http, Response, RequestOptions, Headers, Request, RequestMethod} from 'angular2/http'; 
import {GlobalService} from '../app.service'; 
import 'rxjs/Rx'; 


@Injectable() 
export class ApiService { 
    constructor(private http: Http) {} 

    apiURL = 'http://localhost:8000/api/'; 
    assetURL = 'http://localhost:8000/media/'; 

    GET(url) { 
     var headers = new Headers(), authtoken = localStorage.getItem('authtoken'); 
     headers.append("Content-Type", 'application/json'); 

     if (authtoken) { 
     headers.append("Authorization", 'Token ' + authtoken) 
     } 
     headers.append("Accept", 'application/json'); 

     var requestoptions = new RequestOptions({ 
      method: RequestMethod.Get, 
      url: this.apiURL + url, 
      headers: headers 
     }) 

     return this.http.request(new Request(requestoptions)) 
     .map((res: Response) => { 
      if (res) { 
       return { status: res.status, json: res.json() } 
      } 
     }); 
    } 
} 

Excuse die schlechte Frage, ob es war, ich noch angular2 lerne und konnte online keine konkrete Lösung finden.

+0

Was ist der 'Promise' für Sie von' setUser zurückkehren() '? –

+0

@ GünterZöchbauer Wenn Sie sich auf meine vorherige Frage beziehen, die Sie beantwortet haben, lädt die Profilkomponente für die Profilkomponente nach dem Versprechen die Profilseite für den Benutzer. Und dann können alle untergeordneten Komponenten getUser verwenden, um den vom Dienst festgelegten Benutzer abzurufen. –

+0

Können Sie bitte den Link posten, ich kann mich nicht erinnern. –

Antwort

0

Wenn Sie ein Versprechen benötigen, könnten Sie so etwas wie folgt verwenden:

setUser(slug) { 
    return new Promise((resolve, reject) => { 
     this._api.GET('users/' + slug + '/?slug=true').subscribe(
     data => { 
      this.user = data.json; 
      resolve(data.json); 
     }, 
     (err) => { 
      console.log(err); 
      reject(err); 
     } 
    )) 
} 

Ansonsten lösen Sie das Abonnement und nicht die empfangenen Daten ...

0

Wenn Sie eine Promise benötigen, können Sie nur verwenden, toPromise

import {toPromise} from 'rxjs/operator/toPromise' 

... 

    setUser(slug) { 
     return this._api.GET('users/' + slug + '/?slug=true') 
     .map(
      data => { this.user = data.json; return data.json; } 
     ) 
     .toPromise() 
     .catch(err)=>console.log(err)); 
    } 
Verwandte Themen