【问题标题】:Typescript/Javascript objects [duplicate]打字稿/Javascript对象[重复]
【发布时间】:2016-08-26 02:48:47
【问题描述】:

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

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

【问题讨论】:

  • 这个问题每天被问两次。在您创建 异步 请求后立即执行console.log(user)。很久之后,当响应终于回来时,传递给 subscribe() 的回调函数中的代码被执行。这就是为什么你需要传递一个回调函数。如果调用是同步的,它将直接返回数据,并且不会用 observables 和 callacks 来打扰您。

标签: javascript typescript horizon


【解决方案1】:

下面一行:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 2017-09-16
    • 2018-03-06
    • 2019-12-24
    • 2017-05-03
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多