如何超越承诺的价值

时间:2017-08-01 03:50:18

标签: javascript asynchronous promise

我有以下代码:如何从这个承诺中提取价值?

  var value = Auth.loggedinUser().then(function (user){
    return user.id
  });

  console.log(value)

这是我的承诺:

Promise {$$state: Object}
    $$state:Object
    status:1
    value:2
__proto__:Object
__proto__:Object

我试图将值取出并将其设置为我的值变量。哪个应该是2或者它将返回的任何东西。

我的目标是在可能的情况下将promise的值设置为全局变量

1 个答案:

答案 0 :(得分:5)

承诺的整个概念是,您只能在.then()处理程序中获取和使用promise的值。你无法直接从承诺中获取值,也不应该尝试,因为如果你这样做,很可能是因为你实际上并没有掌握异步代码的工作方式以及承诺的工作方式。

因此,在您的代码中,您需要使用user.id处理程序中的.then()或者在您传递给它的某个函数中使用.then()处理程序内部调用的函数。 / p>

Auth.currentUser().then(function (user){
    // use user.id here
    // or call some other function here and pass it the id myFunc(user.id)
});

// You do not use user.id here

获取user对象的代码是异步的。这意味着它是非阻塞的,并且它将来会完成一些未知的时间。您可能知道useruser.id值现在有效的唯一地方是.then()处理程序内部。

这是一个类比。你把汽车投入使用。他们说他们不知道什么时候准备好接送,因为他们还不知道什么是错的,他们需要多长时间来诊断,获取零件并修复它。他们说他们会在完成后给你打电话。因此,在这一点上,您无法制定任何计划,包括使用您的汽车,因为您实际上并不知道它何时会准备就绪。服务中心给了你一个承诺"当他们准备就绪时他们会给你打电话然后(只有到那时)你可以来接你或者计划一下你什么时候开车。因此,您可以为您的汽车制定计划的唯一地方是在他们给您回电并告诉您什么时候准备就绪之后的情况。来自服务中心的回调就像承诺的.then()处理程序。只有源自.then()处理程序的代码才能对已解析的值执行任何操作。

Promise故意不透明,所以你无法看到它们。他们已定义了一个标准界面,可通过.then().catch()错误通知您。这就是你如何使用承诺。异步编码通常需要一些习惯(与大多数其他编程环境中使用的不同范例),并且承诺构建在其之上,以便为异步操作提供通知,协调,链接和传播错误的标准方法,这也需要一点点学习。

  

我的目标是在可能的情况下将promise的值设置为全局变量

由于多种原因,这几乎不是使用通过异步操作获得的值的正确方法。除了避免全局变量的通常原因之外,任何可能想要使用此值的代码在它实际上是有效值时根本不知道。该信息仅在.then()处理程序中已知(或者在.catch()处理程序中出现错误时)。