2016-10-20 3 views
1

매우 간단한 코드가 있지만 이해할 수 없습니다.Angular2 약속에 대해 혼란 스럽습니다.

내가 현재 사용자 이름을 반환하는 서비스를

그래서 나는 웹 페이지에서 사용자 이름과 디스플레이를 기록 얻을 다음을 수행하고있다. 현재 로그인 한 사용자는 "데모"입니다.

this.userData.getUsername().then(value => { 
this.username = value ; 
console.log("Inside -->" + value); 
}); 
console.log("Outside -- >" + this.username); 

이제이 코드를 실행할 때입니다. 나는이 CONSOLE.LOG의 출력
Outside -- >undefined Inside -->demo
Shoulnd't 두 경우에이 디스플레이 '데모'이다 this.username

에 이름을하지 않습니다. (내부 및 외부) 외부가 정의되지 않은 이유는 무엇입니까 ??

이해해주세요.

+1

호출이 비동기이기 때문입니다. 그것은'getUsername()'메소드를 실행하기 시작했지만, 실행되는 동안 계속 진행됩니다. 그래서 그것은 외부 로그를 먼저 쳐서,'this.username'이 아직 정의되지 않은 상태에서 메소드가 끝나면 내부 로그를 얻습니다. –

+0

Angular 2와 관련이 없습니다. 이것은 비동기 호출이 작동하는 방식입니다. [https : //developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests) –

답변

2

이것은 예상되는 동작입니다.

는 비동기 호출 함수

value => { 
    this.username = value ; 
    console.log("Inside -->" + value); 
} 

에게 결국 Promise 완료 실행하면 그 동안 실행 뒷부분

this.userData.getUsername().then(value => { 
    this.username = value ; 
    console.log("Inside -->" + value); 
}); 

반환 비동기 호 여기

console.log("Outside -- >" + this.username); 

계속 인 그것은 이전에 통과되었습니다.

+0

고마워. 그러면 전역 변수 (this.username)에서 사용자 이름을 얻는 방법은 무엇입니까? – viks

+1

이것은 코드가 이미 수행하고있는 작업입니다. 당신이 혼란스러워하는 것은 때 일어나는 일입니다. 'this.username = value;'는 훨씬 나중에 실행됩니다. console.log ("Outside ->"this.username); ' –

+1

알립니다. 방금 혼란스러워하고 다음 단계를 코드 작성하지 않았습니다. 실제로 변수에서 올바른 값을 얻고 있습니다. 그냥 나 자신을 믿어야 했어. – viks

관련 문제