Javascript 如何从承诺中提取价值
我有下面的代码:我如何从这个承诺中获得价值Javascript 如何从承诺中提取价值,javascript,asynchronous,promise,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 我只是想把值取出来,
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或者它返回的任何值
我的目标是在可能的情况下将承诺的值设置为全局变量。承诺的整个概念是您仅在
处理程序中获取并使用承诺的值。然后()
处理程序或使用等待。你不能直接从承诺中获取价值,也不应该试图获取,因为如果你是,这可能是因为您没有真正掌握异步代码是如何工作的,承诺是如何工作的,以及值何时可用的时间是未知的,因此您必须使用承诺通知系统来知道值何时可用
因此,在代码中,您需要在.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
或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
这里有一个类比。你把你的车投入使用。他们说,他们不知道什么时候可以拿到,因为他们还不知道出了什么问题,也不知道他们需要多长时间来诊断、获取零件和修复。他们说事情结束后会打电话给你。所以,在这一点上,你不能制定任何计划,包括使用你的车,因为你真的不知道它什么时候会准备好。服务中心给了你一个“承诺”,当车准备好时,他们会给你打电话,然后(而且只有那时)你才能进来取车,或者计划你什么时候可以拥有你的车。所以,你唯一可以为你的汽车制定计划的地方是在他们给你回电话并告诉你什么时候可以准备好之后发生的情况。来自服务中心的回调类似于promise的.then()
处理程序。只有在源于该.then()
处理程序的代码中,才能使用解析的值执行任何操作
承诺是故意不透明的,所以你不能看里面。他们已经定义了一个标准接口,用于通过.then()
或.catch()
通知完成或错误。这就是你使用承诺的方式。异步编码通常需要一些时间来适应(与大多数其他编程环境中使用的范式不同),并且承诺在此基础上为异步操作提供一种通知、协调、链接和传播错误的标准方式,这也需要一些学习
我的目标是尽可能将承诺的值设置为全局变量
出于以下几个原因,这绝不是使用通过异步操作获得的值的正确方法。除了通常避免使用全局变量的原因外,任何可能希望使用此值的代码根本不知道它何时实际是有效值。该信息仅在.then()
处理程序内部或使用wait
(或在.catch()
处理程序中出现错误时)后才知道。Promise。那么方法是如何。。。请注意,的返回值。然后
是一个承诺,只有在内部。然后
回调能够获得承诺值(一旦解析)吗?我可以将其设置为它外部的全局变量吗?是的,但它仍然是异步设置的,因此无法保证值何时会存在。。。因此,没有理由使用全局值作为未来值。注意:异步代码在您理解它之前是令人困惑的。全局代码是一个禁忌。您没有抓住承诺
correctly@Wainage-我敢说,他一般不会掌握异步代码:托利明白了!谢谢你的解释