2017-05-15 1 views
0

구성 요소에서 서비스를 호출하는 데 문제가있어서 데이터가 null이됩니다. 이것은 예입니다각도 2의 subscribe 메소드 후에 변수가 null이 됨

서비스 방법

updateParametre(message: string){ 
    let currentUser = new User(); 

    this._us.getOneUser().subscribe(
     data =>currentUser = data.data, 
     error => console.log('error from updateParam ParamtereComponenet ' + error), 
    () => console.log(currentUser) 
    ); 
let anotherinstance : User = currentuser ; 
console.log(currentUser); 
    } 

이 가입 방법 내부의 currentUser 콘솔하려고 : 구성 요소의

getOneUser() { 
    return this._http.get(globals.serverIp + '/user/getOneUser/' + this._ls.getCurrentUserName(), { headers: this.headers}) 
     .map((response: Response) => <UserParser> response.json()); 
    } 

방법

{id: 9, 
initials: "YCI", 
nom: "CHABLI", 
prenom: "Yassin", 
password: "$2a$10$iWVnXs/2TwOk7CBr5RuQ.e/1c/BTlxsvkjHyYrtOgKUiRMll2EupO"} 

을하지만, object anotherintance가 null이되고, 또한 currentUser를 콘솔 밖에서 콘솔하려고 시도합니다. e subscribre go null ..

무엇이 문제입니까?

+1

[각도 2 - Observable에서 직접 데이터 반환] (http://stackoverflow.com/questions/37867020/angular-2-return-data-directly-from-an-observable) – developer033

+0

해결 방법 그거야? –

+0

방금 ​​서비스 방법을 추가하면 다시 세부 정보를 볼 수 있습니다 –

답변

0

anotherInstance은 그 기능에 적용됩니다. 이 참조 범위를 벗어나면 해당 범위를 벗어나 선언해야합니다.

subscribe 메서드는 비동기입니다. anotherInstancecurrentUser으로 설정하고 있지만 그 당시 currentUser은 단지 new User()입니다. 그런 다음 함수가 완료되면 정의되지 않습니다.

anotherInstance: User; 

updateParametre(message: string){ 
    let currentUser = new User(); 

    this._us.getOneUser().subscribe(
     (data) => { 
     currentUser = data.data, 
     this.anotherInstance = currentUser 
     } 
     (error) => console.log(`error from updateParam ParamtereComponenet: ${error}`), 
    () => console.log(currentUser) 
    ); 
    } 

그런 다음 anotherInstanceupdateParameter 방법의 클래스의 재산과 외부에서 액세스 될 것입니다 : 당신이 실제로 데이터가있을 때

범위는 변수가 적절하게 자신의 값을 설정합니다.

+0

하지만 우리가 콘솔하려고하면 : console.log (currentUser) 구독 외부 그것은 동일한 변수에 대해 작동하지 않습니다 –

+0

아니요, 그렇습니다. 'subscribe' 메쏘드 밖에있는 당신의'console.log (currentUser)'는'subscribe' 콜백 전에 * 발생합니다. 'subscribe' 밖에서는 * 항상 * 새로운 User()가됩니다. – joh04667

+0

다음과 같이 해보십시오 : Console.log는'subscribe' 메소드 외부의 메시지를 보낸 다음 첫 번째'subscribe' 콜백에서 console.log 다른 메시지를 보냅니다. 먼저 어느 것이 발사되는지보십시오. – joh04667