2016-08-25 2 views
1

私は常に学習しています。私の質問は:なぜ、この:Typescript/Javascriptオブジェクト

...

そして、なぜ私は値を取得することはできません?:

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

私の3番目の質問:どのようにし

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); 

は私にこれを提供しますクエリの結果をオブジェクトに保存してクエリの外で使用するだけですか?私が 'return'キーワードを使用すると、結果は似ています。私はそれが初心者の質問だと知っているが、私は本当にこれで苦労している...誰かが私を助けることができますか?

+1

この質問は1日2回お願いしています。 **非同期**リクエスト**を作成した直後にconsole.log(user)が実行されます。応答が最終的に戻ってから、しばらくすると、subscribe()に渡されたコールバック関数内のコードが実行されます。そのため、コールバック関数を渡す必要があります。呼び出しが同期的だった場合は、データを直接返すため、観察可能なコールバックやコールクックでは気にしません。 –

答えて

2

次の行:

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

は、非同期メソッドを呼び出しています。つまり、subscribeが呼び出された時点ですぐには提供されないコールバックが後で呼び出されることになります。したがって、console.log()になると、ブラウザはその文字列表現を表示し、その時点で姓と名の両方がまだ入力されていないため、空のフィールドになります。後でオブジェクトをクリックすると、コンソールのコンテンツが表示されます。ブラウザはその時点で評価します。サブスクライブメソッドはすでに終了している可能性が高いため、姓と名が表示されます。

あなたのコードは実際にはローカルのuser変数にデータを保存します。覚えておく必要があることは、subscribeコールバックが呼び出された後にのみアクセスする必要があることです。

+0

ありがとうございました! – Patrick1870

関連する問題