2016-08-25 10 views
1

나는 항상 배우고있다. 내 질문은 :이 이유 :Typescript/Javascript 객체

let user = { 
    firstname: '', 
    secondname: '' 
} 

let hz = new Horizon({host: "164.132.192.28:3100"}); 
let table = hz('users'); 
hz.connect(); 
table.find(1).fetch().subscribe((value) => { 
    user = { 
    firstname: value.firstname, 
    secondname: value.secondname 
    } 

    //OR: 
    user.firstname = value.firstname; 
    user.secondname = value.secondname; 

}); 

console.log(user); 

저에게이 있습니다 : 방법 :

...

을 그리고 값?

console.log(user.firstname); 
//prints nothing 

내 세 번째 질문을받을 수없는 이유 쿼리 결과를 개체에 저장하고 쿼리 외부에서 사용하면됩니까? 'return'키워드를 사용하면 결과가 비슷합니다. 나는 그것이 초보자 질문 인 것을 안다. 그러나 나는 이것과 정말로 고민하고있다. .. 누군가 나를 도울 수 있냐?

+1

이 질문은 하루에 두 번 묻습니다. console.log (user)는 ** 비동기 ** 요청을 ** 생성 한 직후에 실행됩니다. 응답이 마침내 돌아 오면 오랜 시간이 지나면 subscribe()에 전달 된 콜백 함수 내의 코드가 실행됩니다. 그래서 콜백 함수를 전달해야합니다. 호출이 동기식이면 데이터를 직접 반환하고 관측 가능 및 콜크로 귀찮게하지 않을 것입니다. –

답변

2

다음 줄 :

table.find(1).fetch().subscribe(...); 

비동기 메소드를 호출한다. 즉, 제공된 콜백은 나중에 subscribe이 호출 된 순간이 아니라 바로 언젠가 호출됩니다. 따라서 console.log()의 경우 브라우저가 문자열 표현을 출력하고 그 순간에 이름과 성 모두 아직 채워지지 않습니다. 따라서 빈 필드가 표시됩니다. 나중에 객체를 클릭하면 콘솔에서 콘텐츠를 볼 수 있습니다. 브라우저는 그 순간에 그것을 평가하고 구독 방법은 이미 끝났기 때문에 이름과 성을 얻을 수 있습니다.

코드는 실제로 로컬 변수 user에 데이터를 저장합니다. 기억해야 할 점은 subscribe 콜백이 호출 된 후에 만 ​​액세스해야한다는 것입니다.

+0

답변 해 주셔서 감사합니다. – Patrick1870