2016-04-27 3 views
0

Возможно, у меня есть что-то очень очевидное, но то, что я пытаюсь сделать, это обмениваться данными, которые я получаю с сервера асинхронно между компонентами.Совместное использование данных async в сервисе angular2

Это то, что моя служба выглядит следующим образом:

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

Поскольку процесс является асинхронным мне нужно Обещайте ответ, однако обещанный ответ возвращает фактические подписываться объект, а не возвращенная data.json.

Это страница профиля, состоящая из вложенных маршрутов, поэтому я не могу передать данные маршрутизируемым компонентам. Одним из маршрутизированных компонентов является «Сообщения», и после загрузки профиля это должно начинать прием сообщений ТЕКУЩЕГО ПОЛЬЗОВАТЕЛЯ В СЕРВИСЕ.

Так это то, что мне нужно случиться:

  1. Пользователь переходит к его/ее профиль.
  2. Сервисные вызовы setUser ('foo'), после ответа, показать страницу профиля.
  3. Fetch пост пользователя в компонент сообщений с помощью GetUser сервиса()

Служба апи выглядит следующим образом:

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

Оправдание бедный вопрос, если он был, я все еще учусь angular2 и не смог найти конкретного решения для этого онлайн.

+0

Что такое 'Promise' для возврата из' setUser() '? –

+0

@ GünterZöchbauer Если вы ссылаетесь на мой предыдущий вопрос, на который вы ответили, то для компонента «Профиль» после обещания компонент профиля загружает страницу профиля для пользователя. И тогда любые дочерние компоненты могут использовать getUser для извлечения пользователя, установленного сервисом. –

+0

Не могли бы вы разместить ссылку, я не помню. –

ответ

0

Если вам нужно обещание, вы могли бы использовать что-то вроде этого:

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

В противном случае вам разрешить подписку и не полученные данные ...

0

Если вам нужен Promise вы можете просто использовать 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)); 
    } 
Смежные вопросы