我的代码:
let AuthUser = data => {
return google.login(data.username, data.password).then(token => { return token } )
}
当我试图运行这样的东西:
let userToken = AuthUser(data)
console.log(userToken)
我得到:
Promise { <pending> }
但是为什么呢?
我的主要目标是得到令牌从google.login(数据。用户名,data.password),返回一个承诺,到一个变量。然后再执行一些动作。
我之前也遇到过同样的问题,但我在前端的情况有点不同。我还是会分享我的场景,也许有人会觉得有用。
我有一个api调用/api/user/注册在前端的电子邮件,密码和用户名作为请求体。在提交表单(注册表单)时,会调用一个handler函数,它会启动对/api/user/register的取回调用。我在这个处理函数的开始行中使用了event.preventDefault(),所有其他行,比如形成请求体以及获取调用都是在event.preventDefault()之后编写的。这将返回一个待处理的承诺。
但是当我把请求正文的形成代码放在event.preventDefault()上面时,它返回了真正的承诺。是这样的:
event.preventDefault();
const data = {
'email': email,
'password': password
}
fetch(...)
...
而不是:
const data = {
'email': email,
'password': password
}
event.preventDefault();
fetch(...)
...
如果这种情况发生在一个多值的数组中。
[
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> }
]
你可以使用Promise.all()来解决所有的promise。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
请参阅MDN承诺部分。特别是,查看then()的返回类型。
要登录,用户代理必须向服务器提交请求并等待接收响应。由于在请求往返期间让应用程序完全停止执行通常会导致糟糕的用户体验,实际上每个让您登录(或执行任何其他形式的服务器交互)的JS函数都将使用Promise或非常类似的东西来异步交付结果。
现在,还要注意,return语句总是在它们出现的函数的上下文中求值。所以当你写:
let AuthUser = data => {
return google
.login(data.username, data.password)
.then( token => {
return token;
});
};
语句返回令牌;意味着传递给then()的匿名函数应该返回令牌,而不是AuthUser函数应该返回令牌。AuthUser返回的是调用谷歌的结果。login(用户名,密码).then(回调);,这恰好是一个承诺。
最终你的回调令牌=>{返回令牌;}什么都不做;相反,then()的输入需要是一个以某种方式实际处理标记的函数。
我之前也遇到过同样的问题,但我在前端的情况有点不同。我还是会分享我的场景,也许有人会觉得有用。
我有一个api调用/api/user/注册在前端的电子邮件,密码和用户名作为请求体。在提交表单(注册表单)时,会调用一个handler函数,它会启动对/api/user/register的取回调用。我在这个处理函数的开始行中使用了event.preventDefault(),所有其他行,比如形成请求体以及获取调用都是在event.preventDefault()之后编写的。这将返回一个待处理的承诺。
但是当我把请求正文的形成代码放在event.preventDefault()上面时,它返回了真正的承诺。是这样的:
event.preventDefault();
const data = {
'email': email,
'password': password
}
fetch(...)
...
而不是:
const data = {
'email': email,
'password': password
}
event.preventDefault();
fetch(...)
...