2016-04-06 3 views
0

UPDATE: извините, что скопировал неправильную версию моего кода: я звонил then внутри службы, как показано на рисунке.Angular2 не может получить данные из сервиса

Я создаю Службу, которая предоставляет макет данных (по аналогичной структуре, как here), но по какой-то причине не может получить данные.

фрагмент из AppComponent

export class AppComponent implements OnInit{ 
    ngOnInit(){ 
    this.getData(); 
    } 


    constructor(private _dataService: DataService){ } 

    getData(){ 
     console.log('get data called'); 
     var data = this._dataService.getData(); 
     console.log('data type is '+typeof(data)); 
     console.log('data key is '); 
     for(var k in data){ 
     console.log(k); 
     } 

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

import {Injectable} from 'angular2/core'; 
import {MOCK_DATA} from './mock-data'; 

@Injectable() 
export class DataService{ 
    getData(){ 
    return Promise.resolve(MOCK_DATA).then(data => data); 
    } 
} 

макет данных:

export var MOCK_DATA = { 
    "apple": [ 
    {"taste": "apple", "really": false}, 
    {"taste": "random", "really": true}, 
    ], 
    "orange": [ 
    {"taste": "orange", "really": false}, 
    {"taste": "random", "really": true}, 
    ], 
} 

однако console.log результаты:

get data called 
app.component.ts:46 data type object 
app.component.ts:47 data key 
app.component.ts:49 __zone_symbol__state 
app.component.ts:49 __zone_symbol__value 
app.component.ts:49 then 
app.component.ts:49 catch 
+0

Я думаю, вам нужно импортировать 'RBACService' в ваш' AppComponent' и ввести в его конструктор. – bhanu

ответ

1

Вам нужно вызвать метод then на возвращаемом обещание методом getData, чтобы иметь возможность получить данные:

getData() { 
    console.log('get data called'); 
    this._dataService.getData().then(data => { 
    // Handle the data 

    // For example 
    console.log('data type is '+typeof(data)); 
    console.log('data key is '); 
    for(var k in data){ 
     console.log(k); 
    } 
    }); 
} 

Метод then должен быть использован в компоненте, а не на службе.

Ваша служба должна быть:

@Injectable() 
export class RBACService{ 
    getData(){ 
    return Promise.resolve(MOCK_DATA); 
    } 
} 

вместо

@Injectable() 
export class RBACService{ 
    getData(){ 
    return Promise.resolve(MOCK_DATA).then(data => data); 
    } 
} 
+0

Метод 'then' должен использоваться вне службы ;-) В вашем случае он находится в сервисе ... –

+0

есть в любом случае использовать' then' внутри Service, чтобы он возвращал фактические данные вместо обещания? Я слышал, что полезно возвращать данные вместо обещания внутри службы, потому что вызывающему абоненту не нужно знать, как передаются данные (скажем, мы можем перейти на Observable в будущем). еще раз спасибо! – totoro

+0

Добро пожаловать! Если вы извлекаете данные синхронно, вам не нужно обещать/наблюдать, и вы можете напрямую возвращать данные. Тем не менее, в большинстве случаев это из HTTP-запросов, поэтому они асинхронны, и вам тоже нужно. –

1

Я думаю, что вам не хватает какой-то важную часть вашего кода в декоратора для AppComponent, что-то вроде этого:

import { Component, OnInit } from 'angular2/core'; 
import { RBACService } from './(serviceName).service'; 

@Component({ 
    selector: 'my-app', 
    template: `whatever...`, 
    providers: [RBACService] 
}) 
export class AppComponent implements OnInit { 

Где (serviceName) должно быть именем вашего неактивного s и е р в whatch из причин вы inyected его в конструктор как DataService и это на самом деле называется RBACService ...

+0

спасибо за ответ.извините за несоответствие имени; я изменил их в вопросе SO, чтобы сделать его более общим, поэтому на самом деле это не причина проблемы. – totoro

Смежные вопросы