Typescript/Javascript对象

Typescript/Javascript对象,javascript,typescript,horizon,Javascript,Typescript,Horizon,我一直在学习。我的问题是:为什么会这样: 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.fi

我一直在学习。我的问题是:为什么会这样:

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”关键字,那么结果是相似的。我知道这是一个新手问题,但我真的很难解决这个问题。。。有人能帮我吗?

下面一行:

table.find(1).fetch().subscribe(...);
正在调用异步方法。这意味着提供的回调将在稍后调用,而不是在调用
subscribe
时立即调用。因此,当涉及到
console.log()
时,浏览器会打印出它的字符串表示,此时名字和姓氏都还没有填充,因此字段为空。稍后,当您单击该对象以在控制台中查看其内容时,浏览器会在此时对其进行评估,并且很可能subscribe方法已经完成,因此您会看到您的名字和姓氏


您的代码实际上是将数据保存在本地
user
变量中。您必须记住的是,只有在调用了
subscribe
callback之后才能访问它。

这个问题一天要问两次。创建异步请求后,立即执行console.log(user)。很长一段时间后,当响应最终返回时,将执行传递给subscribe()的回调函数中的代码。这就是为什么需要传递回调函数。如果调用是同步的,它将直接返回数据,并且不会因为可观察对象和回调而困扰您。