2017-02-16 1 views
1

나는이 클래스가 정의되지 않은 다른 클래스들). 다음은이 클래스 사용하여 파일의 한 예입니다 :타이프 라이터 기능 반환 내 <strong>각도 2</strong> 프로젝트에서

enter image description here : 내가 할 경우는 loadEnvData() 함수에 보면 그래서

import { Injectable, Component } from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import 'rxjs/add/operator/map'; 
import { ApiEnvConf } from './api-env-conf-class'; 

@Injectable() 
@Component({ 
    providers: [ ApiEnvConf ] 
}) 
export class ImportConfig { 

    /** 
    * @type {ApiEnvConf} 
    */ 
    public envParam = new ApiEnvConf(); 

    constructor(
    public http: Http 
) {} 

    loadEnvData() { 
    this.http.get('assets/env-config/parameters.json') 
    .map((res: Response) => (res.json())) 
    .subscribe(
     data => { 
     this.envParam = this.instanciateApiEnvConfClass(data); 
     return this.envParam; 
     }, 
     err => { 
      console.log("oops !"); 
      return err; 
     } 
    ) 
    } 

    instanciateApiEnvConfClass(data: Object){ 
    let apiEnvConf = new ApiEnvConf(); 
    // set dev by calling getter of ApiEnvConf class 
    apiEnvConf.devEnv = { 
     environnement: data["dev"]["environnement"], 
     basePath: new URL(data["dev"]["basePath"]) 
    }; 
    // set stagging by calling getter of ApiEnvConf class 
    apiEnvConf.stagingEnv = { 
     environnement: data["staging"]["environnement"], 
     basePath: new URL(data["staging"]["basePath"]) 
    }; 
    // set prod by calling getter of ApiEnvConf class 
    apiEnvConf.prodEnv = { 
     environnement: data["prod"]["environnement"], 
     basePath: new URL(data["prod"]["basePath"]) 
    }; 
    return apiEnvConf; 
    } 
} 

내가 내 콘솔 브라우저에서이 결과를 가지고 console.log(this.envParam);return 전에

내 수업 ApiEnvConf가 비어 있지 않아 필요한 모든 속성이 있습니다.

클래스 ImportConfig는 환경 설정을 초기화하기 위해 많은 파일에서 사용하는 또 다른 클래스입니다.

import { Injectable, Component } from '@angular/core'; 
import { ImportConfig } from '../services/import-config'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
@Component({ 
    providers: [ ImportConfig ] 
}) 
export class Test { 
constructor(public http: Http, public config: ImportConfig) { 
    this.config; 
    this.check(); 
    } 

    check() { 
    let test = this.config.loadEnvData(); 
    console.log(test); 
    } 

    /* 
    ... 
    ... 
    ... 
    */ 
} 

console.log(test);의 출력은"정의되지 않은"저를 반환

그래서 다른 폴더의 다른 클래스에 나는이 클래스를 가지고있다. 내가 어디서 잘못한거야?

loadEnvData(env: string = "dev") { 
    this.http.get('assets/env-config/parameters.json') 
    .map((res: Response) => (res.json())) 
    .subscribe(
     data => { 
     this.envParam = this.instanciateApiEnvConfClass(data); 
     return this.envParam; 
     }, 
     err => { 
      console.log("oops !"); 
      return err; 
     } 
    ) 
    // Note: *here* is where you would, in theory, return something 
    } 

당신이 명시 적으로 return없이 함수를 호출, 그것은 undefined를 반환

+0

'this.config;는 무엇을해야합니까? – Pointy

+0

코드 디버깅을 시도하고 loadEnvData에 중단 점을 추가 한 다음 행을 참조하십시오. – Juan

+0

'loadEnvData'는 아무 것도 반환하지 않습니다. – 4castle

답변

3

당신은 아무것도 반환하지 않는 비동기 함수를 호출했다. 이 함수는 동기식이라고 가정했습니다.

loadEnvData 함수는 완료를 나타내는 콜백 메커니즘을 제공해야합니다. 로드 된 데이터에 액세스 할 수 있습니다.