2017-10-10 1 views
0

"제대로 작동하지 않는".람다 식 I이 <em>람다</em> 식에서 <em></em>에서 관찰 가능한 배열에 값을 할당하는 문제에 봉착

나는이 속성을 가진 클래스가 : 나는 HTTP를 서비스를 주입하고있어

usuarios: Usuario[]; 

. 제 콘솔 로그 (람다 식에서 하나)과 완벽하게 데이터를 도시 콘솔 일부 reasong 들어

getUsuarios(): Usuario[] { 

    this._http.get("http://localhost:3000/db").map(data => data.json()).subscribe(data => { 
     this.usuarios = data["Usuarios"]; 
     console.log(this.usuarios); 
    }); 

    console.log(this.usuarios); 

    return this.usuarios; 
    } 

, 상점 :

는 I는 다음과 기능을 가지고있다.

나는 람다 식 외부, 다시 시간을 기록 콘솔하지만, this.usuarios가 비어 (정의되지 않은).

왜 그런 일이 발생합니까? 그것은 참으로 제대로 작동

+2

http.get 함수는 비동기식이므로 http 호출이 완료되기 전에 getUsuarios()가 결과를 반환하므로 null이 반환됩니다. 배열 대신 관찰 가능을 반환하고 싶을 것입니다. – Ploppy

답변

1

의 기대 콘솔 출력은 다음과 같아야합니다

undefined
...some data

이유가 실행되지 않음) HTTP 처음을 console.log를 (의미 비동기 호출을 것입니다 http 요청으로부터 응답을받을 때까지
두 번째 console.log()는 http 요청과 동일한 범위 내에 있지 않으므로 먼저 실행됩니다. 귀하의 질문과 관련된 더 많은 정보를 읽을 수 있습니다 here.

+0

비동기 실행이 완료된 시점을 알 수있는 방법이 있습니까? C#에서 _await_ 연산자와 같은 것입니다. – RottenCheese

+0

비동기 실행이 완료되면 '.subscribe (data => {// 여기 데이터로 뭔가 할 수 있습니다.})' – Andresson

+0

좋아, 한 번 더 바보 같은 질문. _Observable_을 구독하지 않은 경우 http 요청이 계속 전송됩니까? 내 말은, 서버에서 응답을 얻을 수는 있지만 _ Observable_을 구독하지 않기 때문에 아무 일도 일어나지 않을 것입니다, 그렇습니까? 나는 그 안에 응답을 견지 할 것입니다. 관찰 할 수있는 권리, 그렇습니까? 그것이 내가 의미하는 바입니다. 아니면 _ Observable_에 대한 구독을하는 즉시 전송됩니까? 내가 충분히 자신을 충분히 설명했는지 나는 모른다. – RottenCheese