【发布时间】:2020-12-30 15:39:52
【问题描述】:
我一直对这个概念的解释有点好奇。 我知道我只是误解了这一点。 下面是 2 个函数,第一个函数是为了等待另一个函数完成,然后才能解析为 true 或 false,但第二个函数会提前解析为 undefined。
async function authorizeAccount() {
if (await authHandler.onLogin()) {
<!-- removed for brevity -->
}
else {
alert("Something went wrong during authorization. Try again.")
}
}
async onLogin() {
try {
const result = await authorize(this.spotifyAuthConfig);
if (result.authorizationCode) {
axios.get('http://10.0.2.2:8000/authorizespotify/' + result.authorizationCode)
.then((result) => {
//Set token expiration date time
result.data.tokenExpirationDate = Date.now() + (result.data.expires_in * 1000);
asyncStorageHandler.storeObject('tokenObject', result);
return true;
})
}
else {
return false;
}
} catch (error) {
return false;
}
}
有人可以解释为什么这个函数 onLogin 立即解析导致 if 语句解析“未定义”吗? 为什么以下相同功能的早期版本有效?显然,我们在这里等到 onLogin 函数解析为 true/false,然后再继续使用 authorizeAccount 函数。
async onLogin() {
try {
const result = await authorize(this.spotifyAuthConfig);
if (result.accessToken) {
await asyncStorageHandler.storeObject('tokenObject', result);
return true;
}
else {
return false;
}
} catch (error) {
}
}
我应该提一下,在新版本中,所有代码都运行了,我得到了令牌等,最终返回 true,但问题是此时承诺已经解决。那么我该如何规避这种行为呢?
【问题讨论】:
-
第一个 sn-p 等待
authHandler.onLogin()但没有authHandler因此条件立即评估为假。你的意思是if (await this.onLogin()),也许吧? -
旁注:使用标志将拒绝/错误转换为履行/返回通常是一种反模式。在大多数情况下,调用代码应该知道检查授权的尝试失败,而不是返回否定结果。
-
第二个sn-p是老版本,因为要存储一个client secret server端,我重写了函数。是的,对不起,我忽略了一个事实,即这是在使用类和组件的 react 本机项目中,所以一切都井井有条。如前所述,我确实得到了令牌和所有这些,该函数只是提前解决了。
-
axios.get是异步的。但是您并没有等待它,也没有在您的第一个 sn-p 中从onLogin返回任何内容。你必须做return axios.get(... -
derpirscher。我懂了。但我想在解析之前在同一个函数中处理我所有的令牌逻辑。有没有办法做到这一点?
标签: javascript asynchronous ecmascript-6 async-await