【问题标题】:How to pull value out of promise如何从承诺中提取价值
【发布时间】:2017-08-01 03:50:18
【问题描述】:

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

  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 的值设置为全局变量

【问题讨论】:

  • Promise .then 方法是如何...注意,.then 的返回值是一个 Promise,只有在 .then 回调中才能获得承诺的值(一旦它是已解决)
  • 我可以将其设置为外部的全局变量吗?
  • 是的,但它仍会被异步设置,因此无法保证该值何时会出现......因此,没有理由将全局值用于未来值。注意:异步代码在你理解之前是令人眼花缭乱的
  • 全局变量是禁忌。你没有正确掌握Promises
  • @Wainage - 我敢说他一般不会掌握异步代码:p

标签: javascript asynchronous promise


【解决方案1】:

promise 的整个概念是您只能在.then() 处理程序或await 中获取和使用promise 的值。您不能直接从 Promise 中获取值,也不应该尝试这样做,因为如果您这样做了,很可能是因为您实际上并没有掌握异步代码的工作原理、Promise 的工作原理以及值何时可用的时间是未知,因此您必须使用承诺通知系统来知道该值何时可用。

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

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() 处理程序内部。

这是一个类比。您将汽车投入使用。他们说他们不知道什么时候可以取货,因为他们还不知道出了什么问题,也不知道诊断、获取零件和修复它需要多长时间。他们说他们完成后会打电话给你。所以,在这一点上,你不能制定任何计划,包括使用你的汽车,因为你真的不知道它什么时候准备好。服务中心给了你一个“承诺”,当它准备好时,他们会打电话给你,然后(而且只有到那时)你才能进来取车或计划你什么时候有车。因此,您可以为您的汽车制定计划的唯一地方是在他们给您回电并告诉您何时准备好之后出现的情况。来自服务中心的回调就像 Promise 的 .then() 处理程序。只有在源自 .then() 处理程序的代码中,您才能对解析的值执行任何操作。

Promise 是故意不透明的,因此您无法查看它们的内部。他们定义了一个标准接口,用于通过.then() 通知完成或.catch() 出错。这就是你使用承诺的方式。异步编码通常需要一些时间来适应(与大多数其他编程环境中使用的范式不同),并且承诺建立在此之上,为异步操作提供通知、协调、链接和传播错误的标准方式,这也需要一点时间学习。

我的目标是尽可能将 promise 的值设置为全局变量

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

【讨论】:

  • 完全明白了!感谢伟大的 ezxplanation
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
相关资源
最近更新 更多